home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 2 / MacMania 2.toast / Demo's / Tools&Utilities / Programming / SPIM Folder / Sources / y_tab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-30  |  87.1 KB  |  2,959 lines  |  [TEXT/ttxt]

  1. # define Y_EOF 0
  2. # define Y_NL 258
  3. # define Y_INT 259
  4. # define Y_ID 260
  5. # define Y_REG 261
  6. # define Y_FP_REG 262
  7. # define Y_STR 263
  8. # define Y_FP 264
  9. # define Y_ABS_D_OP 265
  10. # define Y_ABS_S_OP 266
  11. # define Y_ADDIU_OP 267
  12. # define Y_ADDI_OP 268
  13. # define Y_ADDU_OP 269
  14. # define Y_ADD_D_OP 270
  15. # define Y_ADD_OP 271
  16. # define Y_ADD_S_OP 272
  17. # define Y_ANDI_OP 273
  18. # define Y_AND_OP 274
  19. # define Y_BC0F_OP 275
  20. # define Y_BC0T_OP 276
  21. # define Y_BC1F_OP 277
  22. # define Y_BC1T_OP 278
  23. # define Y_BC2F_OP 279
  24. # define Y_BC2T_OP 280
  25. # define Y_BC3F_OP 281
  26. # define Y_BC3T_OP 282
  27. # define Y_BEQ_OP 283
  28. # define Y_BGEZAL_OP 284
  29. # define Y_BGEZ_OP 285
  30. # define Y_BGTZ_OP 286
  31. # define Y_BLEZ_OP 287
  32. # define Y_BLTZAL_OP 288
  33. # define Y_BLTZ_OP 289
  34. # define Y_BNE_OP 290
  35. # define Y_BREAK_OP 291
  36. # define Y_CALL_POP 292
  37. # define Y_CFC0_OP 293
  38. # define Y_CFC1_OP 294
  39. # define Y_CFC2_OP 295
  40. # define Y_CFC3_OP 296
  41. # define Y_COP0_OP 297
  42. # define Y_COP1_OP 298
  43. # define Y_COP2_OP 299
  44. # define Y_COP3_OP 300
  45. # define Y_CTC0_OP 301
  46. # define Y_CTC1_OP 302
  47. # define Y_CTC2_OP 303
  48. # define Y_CTC3_OP 304
  49. # define Y_CVT_POP 305
  50. # define Y_CVT_D_S_OP 306
  51. # define Y_CVT_D_W_OP 307
  52. # define Y_CVT_S_D_OP 308
  53. # define Y_CVT_S_W_OP 309
  54. # define Y_CVT_W_D_OP 310
  55. # define Y_CVT_W_S_OP 311
  56. # define Y_C_EQ_D_OP 312
  57. # define Y_C_EQ_S_OP 313
  58. # define Y_C_F_D_OP 314
  59. # define Y_C_F_S_OP 315
  60. # define Y_C_LE_D_OP 316
  61. # define Y_C_LE_S_OP 317
  62. # define Y_C_LT_D_OP 318
  63. # define Y_C_LT_S_OP 319
  64. # define Y_C_NGE_D_OP 320
  65. # define Y_C_NGE_S_OP 321
  66. # define Y_C_NGLE_D_OP 322
  67. # define Y_C_NGLE_S_OP 323
  68. # define Y_C_NGL_D_OP 324
  69. # define Y_C_NGL_S_OP 325
  70. # define Y_C_NGT_D_OP 326
  71. # define Y_C_NGT_S_OP 327
  72. # define Y_C_OLE_D_OP 328
  73. # define Y_C_OLE_S_OP 329
  74. # define Y_C_SEQ_D_OP 330
  75. # define Y_C_SEQ_S_OP 331
  76. # define Y_C_SF_D_OP 332
  77. # define Y_C_SF_S_OP 333
  78. # define Y_C_UEQ_D_OP 334
  79. # define Y_C_UEQ_S_OP 335
  80. # define Y_C_ULE_D_OP 336
  81. # define Y_C_ULE_S_OP 337
  82. # define Y_C_UN_D_OP 338
  83. # define Y_C_UN_S_OP 339
  84. # define Y_DIVU_OP 340
  85. # define Y_DIV_D_OP 341
  86. # define Y_DIV_OP 342
  87. # define Y_DIV_S_OP 343
  88. # define Y_DONE_POP 344
  89. # define Y_GET_POP 345
  90. # define Y_GETC_POP 346
  91. # define Y_GETI_POP 347
  92. # define Y_GIFEQ_POP 348
  93. # define Y_GIFNE_POP 349
  94. # define Y_GIFGT_POP 350
  95. # define Y_GIFGE_POP 351
  96. # define Y_GIFLT_POP 352
  97. # define Y_GIFLE_POP 353
  98. # define Y_GOTO_POP 354
  99. # define Y_JALR_OP 355
  100. # define Y_JAL_OP 356
  101. # define Y_JR_OP 357
  102. # define Y_J_OP 358
  103. # define Y_LBU_OP 359
  104. # define Y_LB_OP 360
  105. # define Y_LHU_OP 361
  106. # define Y_LH_OP 362
  107. # define Y_LUI_OP 363
  108. # define Y_LWC0_OP 364
  109. # define Y_LWC1_OP 365
  110. # define Y_LWC2_OP 366
  111. # define Y_LWC3_OP 367
  112. # define Y_LWL_OP 368
  113. # define Y_LWR_OP 369
  114. # define Y_LW_OP 370
  115. # define Y_MFC0_OP 371
  116. # define Y_MFC1_OP 372
  117. # define Y_MFC2_OP 373
  118. # define Y_MFC3_OP 374
  119. # define Y_MFHI_OP 375
  120. # define Y_MFLO_OP 376
  121. # define Y_MOV_D_OP 377
  122. # define Y_MOV_S_OP 378
  123. # define Y_MTC0_OP 379
  124. # define Y_MTC1_OP 380
  125. # define Y_MTC2_OP 381
  126. # define Y_MTC3_OP 382
  127. # define Y_MTHI_OP 383
  128. # define Y_MTLO_OP 384
  129. # define Y_MULTU_OP 385
  130. # define Y_MULT_OP 386
  131. # define Y_MUL_D_OP 387
  132. # define Y_MUL_S_OP 388
  133. # define Y_NEG_D_OP 389
  134. # define Y_NEG_S_OP 390
  135. # define Y_NOR_OP 391
  136. # define Y_ORI_OP 392
  137. # define Y_OR_OP 393
  138. # define Y_RFE_OP 394
  139. # define Y_SB_OP 395
  140. # define Y_SH_OP 396
  141. # define Y_SLLV_OP 397
  142. # define Y_SLL_OP 398
  143. # define Y_SLTIU_OP 399
  144. # define Y_SLTI_OP 400
  145. # define Y_SLTU_OP 401
  146. # define Y_SLT_OP 402
  147. # define Y_SRAV_OP 403
  148. # define Y_SRA_OP 404
  149. # define Y_SRLV_OP 405
  150. # define Y_SRL_OP 406
  151. # define Y_SUBU_OP 407
  152. # define Y_SUB_D_OP 408
  153. # define Y_SUB_OP 409
  154. # define Y_SUB_S_OP 410
  155. # define Y_SWC0_OP 411
  156. # define Y_SWC1_OP 412
  157. # define Y_SWC2_OP 413
  158. # define Y_SWC3_OP 414
  159. # define Y_SWL_OP 415
  160. # define Y_SWR_OP 416
  161. # define Y_SW_OP 417
  162. # define Y_SYSCALL_OP 418
  163. # define Y_TLBP_OP 419
  164. # define Y_TLBR_OP 420
  165. # define Y_TLBWI_OP 421
  166. # define Y_TLBWR_OP 422
  167. # define Y_XORI_OP 423
  168. # define Y_XOR_OP 424
  169. # define Y_ABS_POP 425
  170. # define Y_BAL_POP 426
  171. # define Y_BEQZ_POP 427
  172. # define Y_BGEU_POP 428
  173. # define Y_BGE_POP 429
  174. # define Y_BGTU_POP 430
  175. # define Y_BGT_POP 431
  176. # define Y_BLEU_POP 432
  177. # define Y_BLE_POP 433
  178. # define Y_BLTU_POP 434
  179. # define Y_BLT_POP 435
  180. # define Y_BNEZ_POP 436
  181. # define Y_B_POP 437
  182. # define Y_LA_POP 438
  183. # define Y_LD_POP 439
  184. # define Y_LP_POP 440
  185. # define Y_LI_POP 441
  186. # define Y_LI_D_POP 442
  187. # define Y_LI_S_POP 443
  188. # define Y_L_D_POP 444
  189. # define Y_L_S_POP 445
  190. # define Y_MFC1_D_POP 446
  191. # define Y_MTC1_D_POP 447
  192. # define Y_MOVE_POP 448
  193. # define Y_MULOU_POP 449
  194. # define Y_MULO_POP 450
  195. # define Y_MUL_POP 451
  196. # define Y_NEGU_POP 452
  197. # define Y_NEG_POP 453
  198. # define Y_NOP_POP 454
  199. # define Y_NOT_POP 455
  200. # define Y_PUT_POP 456
  201. # define Y_PUTC_POP 457
  202. # define Y_PUTI_POP 458
  203. # define Y_PUTS_POP 459
  204. # define Y_REMU_POP 460
  205. # define Y_RETURN_POP 461
  206. # define Y_REM_POP 462
  207. # define Y_ROL_POP 463
  208. # define Y_ROR_POP 464
  209. # define Y_SD_POP 465
  210. # define Y_SEQ_POP 466
  211. # define Y_SGEU_POP 467
  212. # define Y_SGE_POP 468
  213. # define Y_SGTU_POP 469
  214. # define Y_SGT_POP 470
  215. # define Y_SLEU_POP 471
  216. # define Y_SLE_POP 472
  217. # define Y_SNE_POP 473
  218. # define Y_S_D_POP 474
  219. # define Y_S_S_POP 475
  220. # define Y_ULHU_POP 476
  221. # define Y_ULH_POP 477
  222. # define Y_ULW_POP 478
  223. # define Y_USH_POP 479
  224. # define Y_USW_POP 480
  225. # define Y_ALIAS_DIR 481
  226. # define Y_ALIGN_DIR 482
  227. # define Y_ASCII_DIR 483
  228. # define Y_ASCIIZ_DIR 484
  229. # define Y_ASM0_DIR 485
  230. # define Y_BGNB_DIR 486
  231. # define Y_BYTE_DIR 487
  232. # define Y_COMM_DIR 488
  233. # define Y_DATA_DIR 489
  234. # define Y_DOUBLE_DIR 490
  235. # define Y_ENDB_DIR 491
  236. # define Y_ENDR_DIR 492
  237. # define Y_END_DIR 493
  238. # define Y_ENT_DIR 494
  239. # define Y_EQ_DIR 495
  240. # define Y_ERR_DIR 496
  241. # define Y_EXTERN_DIR 497
  242. # define Y_FILE_DIR 498
  243. # define Y_FLOAT_DIR 499
  244. # define Y_FMASK_DIR 500
  245. # define Y_FRAME_DIR 501
  246. # define Y_GLOBAL_DIR 502
  247. # define Y_HALF_DIR 503
  248. # define Y_K_TEXT_DIR 504
  249. # define Y_K_DATA_DIR 505
  250. # define Y_LABEL_DIR 506
  251. # define Y_LCOMM_DIR 507
  252. # define Y_LIVEREG_DIR 508
  253. # define Y_LOC_DIR 509
  254. # define Y_MASK_DIR 510
  255. # define Y_NOALIAS_DIR 511
  256. # define Y_OPTIONS_DIR 512
  257. # define Y_RDATA_DIR 513
  258. # define Y_REPEAT_DIR 514
  259. # define Y_SDATA_DIR 515
  260. # define Y_SET_DIR 516
  261. # define Y_SPACE_DIR 517
  262. # define Y_STRUCT_DIR 518
  263. # define Y_TEXT_DIR 519
  264. # define Y_VERSTAMP_DIR 520
  265. # define Y_VREG_DIR 521
  266. # define Y_WORD_DIR 522
  267.  
  268. # line 308 "parser.y"
  269. #include <stdio.h>
  270. #include "spim.h"
  271. #include "inst.h"
  272. #include "data.h"
  273. #include "mem.h"
  274. #include "reg.h"
  275. #include "sym_tbl.h"
  276.  
  277. /* NOTE: defines for *_RMUM should not be changes lightly. */
  278. /* These must match with the registers used by SYSCALL and */
  279. /* The destination must match src2 so that move works. -SK */
  280. #define A_SRC1_RNUM    4
  281. #define A_SRC2_RNUM    2
  282. #define A_DEST_RNUM    2
  283. #define A_SUB_RNUM    3
  284. #define A_DSUB_RNUM    5
  285. #define AF_SRC1_RNUM    12
  286. #define AF_SRC2_RNUM    0
  287. #define AF_DEST_RNUM    0
  288.  
  289.  
  290. /* Local functions: */
  291.  
  292. static void div_inst (int, int, int, int, int);
  293. static void mult_inst (int, int, int, int);
  294. static void nop_inst (void);
  295. static void set_eq_inst (int, int, int, int);
  296. static void set_ge_inst (int, int, int, int);
  297. static void set_gt_inst (int, int, int, int);
  298. static void set_le_inst (int, int, int, int);
  299. static void store_word_data (int);
  300. static void trap_inst (void);
  301. int op_to_float_op(int);
  302. int op_to_double_op(int);
  303. int BadTypes(int, int, int);
  304.  
  305. char *input_file_name;
  306.  
  307. extern int y_str_length;
  308.  
  309. extern void store_byte();
  310.  
  311. static int null_term;        /* Non-zero means string terminate by \0 */
  312.  
  313. typedef void (*VoidProc)();
  314. static VoidProc store_op;
  315. #if 0
  316. static void (*store_op) ();    /* Function to store items in an EXPR_LST */
  317. #endif
  318.  
  319. int data_dir = 0;        /* Non-zero means item in data segment */
  320.  
  321. int text_dir = 1;        /* Non-zero means item in text segment */
  322.  
  323. extern int in_kernel;        /* Non-zero means kernel segment */
  324.  
  325. static label *this_line_label;    /* Label for curent line or NULL */
  326.  
  327. static label *abstract_line_label;    /* Label for curent line or NULL */
  328.  
  329. static int noat_flag = 0;    /* Non-zero means program can use $1 */
  330.  
  331. #define yyclearin yychar = -1
  332. #define yyerrok yyerrflag = 0
  333. extern int yychar;
  334. extern short yyerrflag;
  335. #ifndef YYMAXDEPTH
  336. #define YYMAXDEPTH 150
  337. #endif
  338. #ifndef YYSTYPE
  339. #define YYSTYPE int
  340. #endif
  341. YYSTYPE yylval, yyval;
  342. # define YYERRCODE 256
  343.  
  344. # line 2540 "parser.y"
  345.  
  346.  
  347. /* Update the address of the label on the current line if one exists. */
  348.  
  349. void fix_current_label_address (mem_addr new_addr)
  350. {
  351.   if (this_line_label != NULL)
  352.       this_line_label->addr = new_addr;
  353.   this_line_label = NULL;    /* Only do this once per line! */
  354. }
  355.  
  356.  
  357. int op_to_imm_op (int opcode)
  358. {
  359.   switch (opcode)
  360.     {
  361.     case Y_ADD_OP: return (Y_ADDI_OP);
  362.     case Y_ADDU_OP: return (Y_ADDIU_OP);
  363.     case Y_AND_OP: return (Y_ANDI_OP);
  364.     case Y_OR_OP: return (Y_ORI_OP);
  365.     case Y_XOR_OP: return (Y_XORI_OP);
  366.     case Y_SLT_OP: return (Y_SLTI_OP);
  367.     case Y_SLTU_OP: return (Y_SLTIU_OP);
  368.     case Y_SLLV_OP: return (Y_SLL_OP);
  369.     case Y_SRAV_OP: return (Y_SRA_OP);
  370.     case Y_SRLV_OP: return (Y_SRL_OP);
  371.     default: fatal_error ("Can't convert op to immediate op\n");
  372.       /*NOTREACHED*/
  373.     }
  374. }
  375.  
  376.  
  377. int imm_op_to_op (int opcode)
  378. {
  379.   switch (opcode)
  380.     {
  381.     case Y_ADDI_OP: return (Y_ADD_OP);
  382.     case Y_ADDIU_OP: return (Y_ADDU_OP);
  383.     case Y_ANDI_OP: return (Y_AND_OP);
  384.     case Y_ORI_OP: return (Y_OR_OP);
  385.     case Y_XORI_OP: return (Y_XOR_OP);
  386.     case Y_SLTI_OP: return (Y_SLT_OP);
  387.     case Y_SLTIU_OP: return (Y_SLTU_OP);
  388.     case Y_J_OP: return (Y_JR_OP);
  389.     case Y_LUI_OP: return (Y_ADDU_OP);
  390.     case Y_SLL_OP: return (Y_SLLV_OP);
  391.     case Y_SRA_OP: return (Y_SRAV_OP);
  392.     case Y_SRL_OP: return (Y_SRLV_OP);
  393.     default: fatal_error ("Can't convert immediate op to op");
  394.       /*NOTREACHED*/
  395.     }
  396. }
  397.  
  398. int op_to_float_op(int opcode)
  399. {
  400.   switch (opcode)
  401.     {
  402.     case Y_ADD_OP: return Y_ADD_S_OP;
  403.     case Y_SUB_OP: return Y_SUB_S_OP;
  404.     case Y_MULT_OP: return Y_MUL_S_OP;
  405.     case Y_DIV_OP: return Y_DIV_S_OP;
  406.     default: yyerror ("No such floating point operation");
  407.     return Y_ADD_D_OP;
  408.     }
  409. }
  410.  
  411.  
  412. int op_to_double_op(int opcode)
  413. {
  414.   switch (opcode)
  415.     {
  416.     case Y_ADD_OP: return Y_ADD_D_OP;
  417.     case Y_SUB_OP: return Y_SUB_D_OP;
  418.     case Y_MULT_OP: return Y_MUL_D_OP;
  419.     case Y_DIV_OP: return Y_DIV_D_OP;
  420.     default: yyerror ("No such floating point operation");
  421.     return Y_ADD_D_OP;
  422.     }
  423. }
  424.  
  425.  
  426. static void nop_inst (void)
  427. {
  428.   r_type_inst (Y_OR_OP, 0, 0, 0);
  429. }
  430.  
  431.  
  432. static void trap_inst (void)
  433. {
  434.   r_type_inst (Y_BREAK_OP, 0, 0, 0);
  435. }
  436.  
  437.  
  438. imm_expr *branch_offset (int n_inst)
  439. {
  440.   return (const_imm_expr (n_inst << 2) - 4); /* Later shifted right 2 places */
  441. }
  442.  
  443.  
  444. static void div_inst (int op, int rd, int rs, int rt, int const_divisor)
  445. {
  446.   if (rd != 0 && !const_divisor)
  447.     {
  448.       i_type_inst (Y_BNE_OP, 0, rt, branch_offset (2));
  449.       trap_inst ();
  450.     }
  451.   if (op == Y_DIV_OP || op == Y_REM_POP)
  452.     r_type_inst (Y_DIV_OP, 0, rs, rt);
  453.   else
  454.     r_type_inst (Y_DIVU_OP, 0, rs, rt);
  455.   if (rd != 0)
  456.     {
  457.       if (op == Y_DIV_OP || op == Y_DIVU_OP)
  458.     r_type_inst (Y_MFLO_OP, rd, 0, 0);
  459.       else
  460.     r_type_inst (Y_MFHI_OP, rd, 0, 0);
  461.     }
  462. }
  463.  
  464.  
  465. static void mult_inst (int op, int rd, int rs, int rt)
  466. {
  467.   if (op == Y_MULOU_POP)
  468.     r_type_inst (Y_MULTU_OP, 0, rs, rt);
  469.   else
  470.     r_type_inst (Y_MULT_OP, 0, rs, rt);
  471.   if (op != Y_MUL_POP && rd != 0)
  472.     {
  473.       r_type_inst (Y_MFHI_OP, 1, 0, 0);    /* Use $at */
  474.       i_type_inst (Y_BEQ_OP, 0, 1, branch_offset (2));
  475.       trap_inst ();
  476.     }
  477.   if (rd != 0)
  478.     r_type_inst (Y_MFLO_OP, rd, 0, 0);
  479. }
  480.  
  481.  
  482. static void set_le_inst (int op, int rd, int rs, int rt)
  483. {
  484.   i_type_inst (Y_BNE_OP, rs, rt, branch_offset (3));
  485.   i_type_inst (Y_ORI_OP, rd, 0, const_imm_expr (1));
  486.   i_type_inst (Y_BEQ_OP, 0, 0, branch_offset (2));
  487.   r_type_inst ((op == Y_SLE_POP ? Y_SLT_OP : Y_SLTU_OP), rd, rs, rt);
  488. }
  489.  
  490.  
  491. static void set_gt_inst (int op, int rd, int rs, int rt)
  492. {
  493.   r_type_inst (op == Y_SGT_POP ? Y_SLT_OP : Y_SLTU_OP, rd, rt, rs);
  494. }
  495.  
  496.  
  497. static void set_ge_inst (int op, int rd, int rs, int rt)
  498. {
  499.   i_type_inst (Y_BNE_OP, rs, rt, branch_offset (3));
  500.   i_type_inst (Y_ORI_OP, rd, 0, const_imm_expr (1));
  501.   i_type_inst (Y_BEQ_OP, 0, 0, branch_offset (2));
  502.   r_type_inst (op == Y_SGE_POP ? Y_SLT_OP : Y_SLTU_OP, rd, rt, rs);
  503. }
  504.  
  505.  
  506. static void set_eq_inst (int op, int rd, int rs, int rt)
  507. {
  508.   imm_expr *if_eq, *if_neq;
  509.  
  510.   if (op == Y_SEQ_POP)
  511.     if_eq = const_imm_expr (1), if_neq = const_imm_expr (0);
  512.   else
  513.     if_eq = const_imm_expr (0), if_neq = const_imm_expr (1);
  514.  
  515.   i_type_inst (Y_BEQ_OP, rs, rt, branch_offset (3));
  516.   /* RD <- 0 (if not equal) */
  517.   i_type_inst (Y_ORI_OP, rd, 0, if_neq);
  518.   i_type_inst (Y_BEQ_OP, 0, 0, branch_offset (2)); /* Branch always */
  519.   /* RD <- 1 */
  520.   i_type_inst (Y_ORI_OP, rd, 0, if_eq);
  521. }
  522.  
  523.  
  524. /* Store the value either as a datum or instruction. */
  525.  
  526. static void store_word_data (int value)
  527. {
  528.   if (data_dir)
  529.     store_word (value);
  530.   else if (text_dir)
  531.     store_instruction (inst_decode (value));
  532. }
  533.  
  534. int BadTypes(int t1, int t2, int t3)
  535. {
  536.     return (((t2 != t3) || (t1 != t2))
  537.     && (((t1 != WORD_A_TYPE) && (t1 != BYTE_A_TYPE))
  538.     ||  ((t2 != WORD_A_TYPE) && (t2 != BYTE_A_TYPE))
  539.     ||  ((t3 != WORD_A_TYPE) && (t3 != BYTE_A_TYPE))
  540.     ));
  541. }
  542.  
  543. /* Old version that allows arrays from all vars */
  544. #ifdef OLDVER
  545. void Store(char *xlabel, int reg)
  546. {
  547.   switch (get_label_type((char *) xlabel)) {
  548.     case WORD_A_TYPE:
  549.       if (reg != 0)
  550.       r_sh_type_inst (Y_SLL_OP, reg, reg, 2);
  551.       i_type_inst (Y_SW_OP, A_DEST_RNUM, reg,
  552.     addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  553.       break;
  554.     case BYTE_A_TYPE:
  555.       i_type_inst (Y_SB_OP, A_DEST_RNUM, reg,
  556.     addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  557.       break;
  558.     case FLOAT_A_TYPE:
  559.       if (reg != 0)
  560.       r_sh_type_inst (Y_SLL_OP, reg, reg, 2);
  561.       i_type_inst (Y_SWC1_OP, AF_DEST_RNUM, reg,
  562.     addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  563.       break;
  564.     case DOUBLE_A_TYPE:
  565.       if (reg != 0)
  566.       r_sh_type_inst (Y_SLL_OP, reg, reg, 3);
  567.       i_type_inst (Y_SWC1_OP, AF_DEST_RNUM, reg,
  568.     addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  569.       i_type_inst (Y_SWC1_OP, AF_DEST_RNUM + 1, reg,
  570.     incr_expr_offset(addr_expr_imm(make_addr_expr(0, xlabel, 0)), 4));
  571.       break;
  572.     default:
  573.       yyerror ("Unknown type");
  574.   }
  575. }
  576. #else /* OLDVER */
  577. void Store(char *xlabel, int reg)
  578. {
  579.   if (reg == 0) {
  580.     switch (get_label_type((char *) xlabel)) {
  581.       case WORD_A_TYPE:
  582.     i_type_inst (Y_SW_OP, A_DEST_RNUM, reg,
  583.       addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  584.     break;
  585.       case BYTE_A_TYPE:
  586.     i_type_inst (Y_SB_OP, A_DEST_RNUM, reg,
  587.       addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  588.     break;
  589.       case FLOAT_A_TYPE:
  590.     i_type_inst (Y_SWC1_OP, AF_DEST_RNUM, reg,
  591.       addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  592.     break;
  593.       case DOUBLE_A_TYPE:
  594.     i_type_inst (Y_SWC1_OP, AF_DEST_RNUM, reg,
  595.       addr_expr_imm(make_addr_expr(0, xlabel, 0)));
  596.     i_type_inst (Y_SWC1_OP, AF_DEST_RNUM + 1, reg,
  597.       incr_expr_offset(addr_expr_imm(make_addr_expr(0, xlabel, 0)), 4));
  598.     break;
  599.       default:
  600.     yyerror ("Unknown type");
  601.     }
  602.   }
  603.   else if (0 == strcmp(xlabel, "M")) {
  604.     /* reg = reg x 4
  605.     if (reg != 0)
  606.     r_sh_type_inst (Y_SLL_OP, reg, reg, 2);
  607.     */
  608.     i_type_inst (Y_SW_OP, A_DEST_RNUM, reg,
  609.       addr_expr_imm(make_addr_expr(0, NULL, 0)));
  610.   }
  611.   else if (0 == strcmp(xlabel, "m")) {
  612.     i_type_inst (Y_SB_OP, A_DEST_RNUM, reg,
  613.       addr_expr_imm(make_addr_expr(0, NULL, 0)));
  614.   } else {
  615.       yyerror("Bad array, use M or m.\n");
  616.   }
  617. }
  618. #endif /* OLDVER */
  619.  
  620.  
  621. void yyerror (const char *s)
  622. {
  623.   extern int line_no;
  624.   extern char *input_file_name;
  625.  
  626.   sprintf(mess_buff, "spim: (parser) %s on line %d of file %s\n",
  627.      s, line_no, input_file_name);
  628.   error (mess_buff);
  629.   print_erroneous_line ();
  630. }
  631. short yyexca[] ={
  632. -1, 1,
  633.     0, -1,
  634.     -2, 0,
  635. -1, 377,
  636.     261, 383,
  637.     -2, 381,
  638.     };
  639. # define YYNPROD 414
  640. # define YYLAST 1195
  641. short yyact[]={
  642.  
  643.    9, 358, 361, 396, 641, 359, 360, 542, 552, 459,
  644.  358, 361, 394, 503, 359, 360, 358, 361, 298, 458,
  645.  359, 360, 510, 513, 358, 361, 511, 512, 359, 360,
  646.  638, 544, 409, 556, 321, 406, 408, 550, 543, 407,
  647.  447, 452, 298, 443, 451, 616, 618, 447, 452, 617,
  648.  298, 451, 578, 580, 311, 565, 579, 300, 301, 355,
  649.  310, 305, 403, 354, 298, 590, 541, 298, 305, 401,
  650.  397, 398, 305, 298, 355, 433, 404, 646, 354, 581,
  651.  577, 436, 434, 429, 428, 426, 421, 420, 419, 417,
  652.  414, 305,   4, 666, 447, 643, 567, 566, 564, 563,
  653.  562, 559, 389, 558, 555, 553, 439, 546, 432, 431,
  654.  548, 430, 424, 422, 418, 412, 323, 295, 294, 293,
  655.  665, 664, 663, 654, 653, 652, 504, 455, 308, 304,
  656.  640, 292, 575, 572, 576, 380, 573, 570, 574, 674,
  657.  571, 673, 668, 532, 306, 667, 312, 644, 637, 315,
  658.  670, 669, 391, 316, 551, 547, 509, 441, 427, 423,
  659.  416, 415, 413, 329, 331, 333, 411, 336, 338, 340,
  660.  342, 410, 346, 348,  67,  66,  65, 319, 320,  64,
  661.   63,  62,  61,  60,  59,  58, 309,  57, 376,  56,
  662.  405,  55, 385, 386, 387, 388, 382, 383, 390,  54,
  663.   53,  52, 296,  51, 399, 400, 402,  50,  49,  48,
  664.   47,  46, 322,  45,  44, 302, 303,  41, 307,  40,
  665.  435, 313, 314,  39, 437, 438,  38,  37,  36,  35,
  666.   34, 491, 324, 325, 326, 327, 328, 330, 332, 334,
  667.  335, 337, 339, 341,  26, 345, 347, 349, 350, 351,
  668.  352,  25,  22,  21, 322,  20,  19,  12,   8, 446,
  669.   11,  10, 447, 445,   7, 247, 246, 162, 161, 152,
  670.  249, 151, 248, 163, 153, 195, 191, 196, 192, 197,
  671.  193, 198, 194, 207, 200, 199, 201, 202, 204, 203,
  672.  208,  27, 353, 238, 239, 240, 241, 450, 449,   6,
  673.    5, 242, 243, 244, 245,  68, 256, 257, 258, 259,
  674.  260, 261, 280, 266, 278, 264, 290, 276, 288, 274,
  675.  289, 275, 285, 271, 287, 273, 291, 277, 282, 268,
  676.  286, 272, 284, 270, 281, 267, 283, 269, 279, 265,
  677.  175, 251, 174, 250,  77,  74,  75,  76,   3, 374,
  678.  378,   2,   1, 454,   0, 220, 218, 219, 217, 121,
  679.  120, 123, 122, 131, 128, 134, 129, 130, 125, 126,
  680.  124, 228, 229, 231, 232, 224, 225, 223, 222, 233,
  681.  234, 236, 237, 226, 227, 182, 181, 253, 252, 263,
  682.  262, 171, 164, 155, 149, 137, 138, 158, 168, 167,
  683.  166, 157, 156, 159, 169, 160, 170, 173, 255, 172,
  684.  254, 143, 146, 144, 145, 140, 141, 139, 150, 545,
  685.  530, 531,   0, 165, 154,  29, 221, 205, 212, 211,
  686.  210, 209, 216, 215, 214, 213, 206,  69,  13, 127,
  687.   14,  15,  16,  17, 136, 135, 230, 235,  33, 180,
  688.  179, 178,  31,  30,  28,  32,  70,  71,  72,  73,
  689.  177, 557, 176,  43,  42, 142, 189, 188, 187, 186,
  690.  185, 184, 183, 190, 148, 147, 133, 132,  18,  24,
  691.   23,  78,  79,  80,  81,  82,  83,  84,  85,  86,
  692.   88,  90,  91,  89,  92,  94,  95,  93,  96,  97,
  693.   98,  99, 100, 101, 116,  87, 102, 103, 104, 105,
  694.  106, 107, 108, 110, 109, 111, 112, 113, 114, 115,
  695.  117, 118, 119, 344, 516, 549, 519, 622, 522, 299,
  696.  525, 554, 534, 535, 297, 560, 297, 297, 442, 297,
  697.  561,   0, 297, 297,   0, 317,   0, 317, 317, 568,
  698.    0,   0, 318, 297, 297, 297, 297, 297, 297, 297,
  699.  297, 297, 297, 297, 297,   0, 297, 297, 297, 297,
  700.  297, 297, 322, 322, 533, 533, 533,   0,   0,   0,
  701.  377,   0,   0, 381, 381, 381,   0,   0, 379,   0,
  702.    0,   0, 384,   0, 444,   0, 507, 444, 514,   0,
  703.  517, 444, 520,   0, 523,   0, 457,   0,   0,   0,
  704.    0, 444, 444, 444, 444,   0, 444, 444, 444, 444,
  705.    0,   0,   0, 425,   0,   0, 357,   0,   0, 475,
  706.  582, 478,   0, 481,   0,   0, 485,   0,   0,   0,
  707.    0,   0, 440,   0,   0,   0,   0,   0,   0, 501,
  708.  502,   0,   0,   0,   0, 505, 506,   0, 639,   0,
  709.  456,   0,   0, 508,   0, 515,   0, 518,   0, 521,
  710.    0, 524,   0,   0,   0, 635,   0, 363, 365, 367,
  711.  369, 371, 373, 473,   0, 476,   0, 479,   0,   0,
  712.  483,   0, 486, 636, 488,   0, 490, 392, 393, 395,
  713.  494,   0, 496,   0,   0,   0, 583,   0,   0, 586,
  714.    0,   0,   0,   0, 591, 343, 593,   0, 533, 596,
  715.    0, 599,   0,   0,   0, 602,   0, 605,   0, 608,
  716.  610, 612, 614,   0,   0,   0,   0,   0,   0,   0,
  717.    0,   0, 655,   0, 536, 656,   0,   0,   0, 657,
  718.    0,   0, 658, 538, 539, 659, 540,   0, 660,   0,
  719.    0, 661,   0,   0, 662, 356, 362, 364, 366, 368,
  720.  370, 372, 375, 584,   0,   0, 587,   0,   0, 589,
  721.    0,   0,   0, 594,   0,   0, 597,   0, 600,   0,
  722.    0,   0, 603,   0, 606,   0, 609, 611, 613, 615,
  723.  619, 620, 621,   0,   0,   0,   0, 623, 624, 625,
  724.  626, 627, 628, 629, 630, 631, 632, 633, 634,   0,
  725.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  726.    0,   0,   0,   0,   0,   0,   0,   0, 448,   0,
  727.    0,   0, 453,   0,   0,   0,   0,   0,   0,   0,
  728.    0,   0, 460, 461, 462, 463,   0, 464, 465, 466,
  729.  467,   0,   0,   0,   0,   0,   0, 492,   0,   0,
  730.    0, 648, 649, 650, 651,   0,   0,   0,   0,   0,
  731.    0,   0,   0,   0,   0,   0,   0,   0, 492,   0,
  732.  492,   0, 492,   0, 492,   0, 492,   0,   0,   0,
  733.    0,   0,   0,   0,   0,   0,   0,   0,   0, 527,
  734.    0,   0,   0, 528, 529,   0,   0,   0,   0,   0,
  735.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  736.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  737.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  738.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  739.    0,   0,   0,   0,   0,   0,   0, 569,   0,   0,
  740.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  741.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  742.    0,   0,   0,   0,   0,   0,   0,   0, 492,   0,
  743.    0, 492,   0,   0,   0,   0, 492,   0, 492,   0,
  744.    0, 492,   0, 492,   0,   0,   0, 492, 537, 492,
  745.    0, 492, 492, 492, 492,   0,   0,   0,   0,   0,
  746.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  747.  468, 469, 470, 471, 472,   0, 474,   0, 477,   0,
  748.  480, 482,   0, 484,   0, 487,   0, 489,   0,   0,
  749.    0, 493,   0, 495,   0, 497, 498, 499, 500,   0,
  750.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  751.    0,   0,   0, 642,   0,   0,   0,   0,   0,   0,
  752.    0,   0, 526,   0, 645,   0, 647,   0,   0,   0,
  753.    0,   0,   0, 585,   0,   0, 588,   0,   0,   0,
  754.  592,   0,   0, 595,   0, 598,   0, 601,   0,   0,
  755.    0, 604,   0, 607,   0,   0,   0,   0,   0,   0,
  756.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  757.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  758.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  759.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  760.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  761.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  762.    0,   0,   0, 671, 672 };
  763. short yypact[]={
  764.  
  765. -1000,-1000,-168,   0,  73,-139,-140,-141,-1000,-1000,
  766. -211,-204,-211,-188,-169,-211,-202,-202,-211,-211,
  767. -202,-211,-204,-211,-211,-202,-1000,-143,-1000,-211,
  768. -211,-211,-211,-188,-188,-188,-211,-188,-188,-188,
  769. -188,-211,-188,-188,-211,-211,-211,-211,-182,-243,
  770. -243,-243,-243,-243,-243,-243,-197,-182,-204,-211,
  771. -211,-211,-204,-202,-202,-202,-202,-202,-169, 112,
  772. -235,-249,-258,-190,-169,-192,-199,-1000,-185,-224,
  773. -1000,-1000,-1000,-144,-1000,-170,-1000,-1000,-1000,-171,
  774. -145,-1000,-172,-173,-174,-1000,-146,-1000,-147,-211,
  775. -175,-1000,-176,-177,-148,-150,-151,-186,-178,-224,
  776. -1000,-1000,-179,-224,-224,-1000,-1000,-153,-211,-1000,
  777. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  778. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  779. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  780. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  781. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  782. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  783. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  784. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  785. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  786. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  787. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  788. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  789. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  790. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  791. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  792. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  793. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  794. -1000,-1000,-1000,-1000,-1000,-1000,   3,-1000,-1000,   3,
  795. -1000,-1000,-212,   3,  36,-1000,  36,-212,-245,-1000,
  796. -1000,-1000,-255,   3,   3,   3,   3,-1000,   3,   3,
  797.    3,   3,-1000,-1000,-211,-211,-211,-211,-211,  36,
  798. -219,  36,-219,  36,-219,-211,  36,-219,  36,-211,
  799.   36,-211,  36,-211,-1000,-211,  36,-211,  36,-211,
  800. -211,-211,-211,-1000,-1000,-1000,-182,-182,-1000,-1000,
  801. -1000,  35,-182,-182,-219,-237,-219,-237,-219,-237,
  802. -219,-237,-219,-237,-1000,-1000,-211,-1000,-1000,-204,
  803. -1000,-1000,-1000,-204,-204,-202,-202,-202,-202,-202,
  804.   36,-235,-1000,-1000,-1000,-1000,-1000,-1000,-1000,  36,
  805.   36,-1000,  36,-1000,-195,-1000,-1000,-1000,-1000,-1000,
  806. -225,-225,-1000,-224,-224,-256,-1000,-1000,-1000,-154,
  807. -224,-155,-230,-256,-156,-158,-1000,-224,-1000,-224,
  808. -159,-160,-161,-206,-1000,-1000,-1000,-1000,-1000,-162,
  809. -163,-224,-1000,-211,  97,  93,-1000,-1000,-1000,-1000,
  810. -1000,-1000,  89,-1000,-180,-207,-181,-1000,-1000,-1000,
  811. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  812. -1000,-1000,-1000,-237,-219,-1000,-235,-219,-1000,-235,
  813. -212,-1000,-194,-235,-219,-1000,-235,-219,-235,-219,
  814. -235,-1000,-1000,-219,-235,-219,-235,-219,-219,-219,
  815. -219,-1000,-1000,-1000,-214,-1000,-1000,-182,-182,-182,
  816. -1000,-1000,-1000,  35,-182,-182,-182,-182,-182,-182,
  817. -182,-182,-182,-182,-182,-182,-1000,-1000,-1000,-1000,
  818. -1000,-202,-1000,-1000,-1000,-1000,-237, 107,-1000,-1000,
  819. -1000,-1000,-233,-1000,-1000,-233,-1000,-224,  72,-1000,
  820. -1000,-260,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-211,
  821. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-164,-1000, 106,
  822. -211,-183,-211,-165,-165,-165,-165,-1000,  32,  31,
  823.   30,-1000,-1000,-1000,-1000,-237,-1000,-1000,-237,-1000,
  824. -1000,-1000,-237,-1000,-1000,-237,-1000,-1000,-237,-1000,
  825. -1000,-237,-1000,-1000,-237,-1000,-1000,-237,-1000,-1000,
  826. -1000,-1000,-1000,-1000,-1000,-1000,  29,  28,  27,-1000,
  827. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  828. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  829. -166,-1000,-1000,-1000,-1000, 104,-1000, 101, 111, 110,
  830. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
  831. -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-211,
  832. -211, 100,  98,-1000,-1000 };
  833. short yypgo[]={
  834.  
  835.    0, 352, 351, 348, 300, 299, 264, 261, 202, 538,
  836.  260, 529, 257, 298, 129, 353, 128, 256, 255, 253,
  837.  153, 252, 251,  34, 244, 715, 230, 231, 229, 228,
  838.  227, 226, 223, 219, 217, 214, 213, 211, 210, 209,
  839.  292, 208, 207, 203, 201, 200, 199, 191, 189, 188,
  840.  187, 185, 184, 135, 183, 182, 181, 180, 179, 143,
  841.  176, 175, 174, 626, 156,  13, 110, 171,   7, 166,
  842.  162, 107, 161,  37, 160, 159, 523, 158, 157, 297,
  843.  186, 155, 154 };
  844. short yyr1[]={
  845.  
  846.    0,   2,   1,   3,   3,   4,   4,   4,   4,   5,
  847.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  848.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  849.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  850.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  851.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  852.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  853.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  854.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  855.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  856.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  857.    5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
  858.    5,   5,   5,  14,  63,  63,  63,  63,  64,  64,
  859.   64,  64,  15,  15,  15,  15,  65,  65,  65,  65,
  860.    7,   7,   7,   7,   7,   7,   7,   7,  10,  10,
  861.   10,  12,  17,  17,  18,  18,  18,  19,  19,  19,
  862.   19,  19,  19,  21,  21,  21,  22,  22,  22,  24,
  863.   24,  26,  26,  26,  26,  26,  26,  26,  28,  28,
  864.   28,  29,  29,  29,  29,  29,  29,  29,  30,  30,
  865.   30,  31,  31,  31,  32,  32,  32,  32,  33,  33,
  866.   33,  35,  35,  36,  36,  37,  37,  38,  38,  34,
  867.   34,  39,  39,  39,  39,  39,  39,  39,  39,  41,
  868.   41,  41,  41,  41,  41,  42,  42,  43,  43,  44,
  869.   44,  45,  45,  46,  46,  47,  47,  48,  48,  48,
  870.   48,  50,  50,  51,  51,  52,  52,  54,  54,  55,
  871.   55,  55,  55,  55,  55,  55,  55,  55,  55,  56,
  872.   56,  56,  56,  56,  56,  56,  56,  57,  57,  58,
  873.   58,  58,  58,  58,  58,  58,  58,  60,  60,  60,
  874.   60,  60,  60,  61,  61,  62,  62,  62,  62,  62,
  875.   62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
  876.   62,  62,  62,  62,  62,  62,  62,  62,  62,  62,
  877.   62,  62,  62,   6,   6,  67,   6,  69,   6,   6,
  878.    6,  70,   6,   6,   6,   6,  72,   6,   6,   6,
  879.    6,   6,   6,   6,   6,   6,   6,  75,   6,   6,
  880.    6,   6,  77,   6,   6,   6,   6,   6,   6,   6,
  881.    6,   6,   6,   6,   6,   6,   6,   6,   6,   6,
  882.    6,  78,   6,   9,   9,   9,   9,   9,   9,   9,
  883.    9,   9,   9,   9,  13,  13,  13,  13,  13,  79,
  884.    8,  25,  27,  49,  53,  20,  76,  16,  23,  59,
  885.   80,  80,  11,  11,  40,  40,  68,  68,  68,  66,
  886.   66,  66,  66,  71,  71,  81,  81,  81,  73,  73,
  887.   82,  82,  74,  74 };
  888. short yyr2[]={
  889.  
  890.    0,   0,   4,   2,   0,   2,   2,   1,   1,   3,
  891.    3,   3,   3,   4,   4,   3,   3,   3,   3,   3,
  892.    3,   3,   3,   3,   3,   3,   1,   2,   1,   3,
  893.    3,   3,   3,   3,   4,   4,   3,   4,   4,   3,
  894.    4,   3,   4,   4,   4,   4,   3,   3,   4,   4,
  895.    4,   4,   3,   4,   4,   4,   4,   4,   4,   4,
  896.    4,   4,   4,   4,   4,   2,   3,   3,   4,   4,
  897.    4,   4,   4,   4,   4,   4,   4,   4,   2,   2,
  898.    3,   2,   3,   2,   2,   3,   3,   3,   4,   3,
  899.    3,   3,   5,   5,   5,   5,   4,   4,   5,   5,
  900.    4,   5,   5,   2,   2,   2,   2,   2,   2,   2,
  901.    3,   3,   3,   2,   2,   1,   3,   3,   4,   4,
  902.    4,   4,   4,   1,   1,   1,   1,   2,   1,   1,
  903.    1,   2,   0,   3,   3,   3,   0,   3,   3,   3,
  904.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  905.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  906.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  907.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  908.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  909.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  910.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  911.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  912.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  913.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  914.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  915.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  916.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  917.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  918.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  919.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  920.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  921.    1,   1,   1,   3,   2,   0,   3,   0,   3,   1,
  922.    2,   0,   3,   3,   1,   1,   0,   3,   2,   2,
  923.    1,   2,   3,   3,   3,   1,   3,   0,   3,   3,
  924.    4,   2,   0,   3,   2,   3,   3,   3,   3,   3,
  925.    2,   2,   1,   1,   2,   2,   2,   1,   1,   3,
  926.    4,   0,   3,   3,   1,   4,   1,   4,   3,   3,
  927.    3,   6,   6,   1,   1,   1,   1,   3,   3,   1,
  928.    1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  929.    1,   1,   1,   1,   1,   1,   2,   1,   1,   1,
  930.    1,   1,   1,   1,   0,   2,   1,   3,   1,   0,
  931.    2,   1,   1,   0 };
  932. short yychk[]={
  933.  
  934. -1000,  -1,  -2,  -3, 260,  -4,  -5,  -6, 258,   0,
  935.   -7, -10, -12, 438, 440, 441, 442, 443, 478, -17,
  936.  -18, -19, -21, 480, 479, -22, -24, 291, 454, 425,
  937.  453, 452, 455, 448, -26, -28, -29, -30, -31, -32,
  938.  -33, -34, 464, 463, -35, -36, -37, -38, -39, -41,
  939.  -42, -43, -44, -45, -46, -47, -48, -50, -51, -52,
  940.  -54, -55, -56, -57, -58, -60, -61, -62, 305, 437,
  941.  456, 457, 458, 459, 345, 346, 347, 344, 481, 482,
  942.  483, 484, 485, 486, 487, 488, 489, 505, 490, 493,
  943.  491, 492, 494, 497, 495, 496, 498, 499, 500, 501,
  944.  502, 503, 506, 507, 508, 509, 510, 511, 512, 514,
  945.  513, 515, 516, 517, 518, 519, 504, 520, 521, 522,
  946.  360, 359, 362, 361, 370, 368, 369, 439, 364, 366,
  947.  367, 363, 477, 476, 365, 445, 444, 395, 396, 417,
  948.  415, 416, 465, 411, 413, 414, 412, 475, 474, 394,
  949.  418, 271, 269, 274, 424, 393, 402, 401, 397, 403,
  950.  405, 268, 267, 273, 392, 423, 400, 399, 398, 404,
  951.  406, 391, 409, 407, 342, 340, 462, 460, 451, 450,
  952.  449, 386, 385, 472, 471, 470, 469, 468, 467, 466,
  953.  473, 276, 278, 280, 282, 275, 277, 279, 281, 285,
  954.  284, 286, 287, 289, 288, 427, 436, 283, 290, 431,
  955.  430, 429, 428, 435, 434, 433, 432, 358, 356, 357,
  956.  355, 426, 378, 377, 375, 376, 383, 384, 371, 372,
  957.  446, 373, 374, 379, 380, 447, 381, 382, 293, 294,
  958.  295, 296, 301, 302, 303, 304, 266, 265, 272, 270,
  959.  343, 341, 388, 387, 410, 408, 306, 307, 308, 309,
  960.  310, 311, 390, 389, 315, 339, 313, 335, 329, 337,
  961.  333, 323, 331, 325, 319, 321, 317, 327, 314, 338,
  962.  312, 334, 328, 336, 332, 322, 330, 324, 318, 320,
  963.  316, 326,  58, 258, 258, 258,  -8, -76, 261, -11,
  964.  261, 262,  -8,  -8, -14, 260, -14,  -8, -16, -80,
  965.  262, 256, -16,  -8,  -8, -16, -20, -76, -11, -20,
  966.  -20, -23, -80, 259,  -8,  -8,  -8,  -8,  -8, -14,
  967.   -8, -14,  -8, -14,  -8,  -8, -14,  -8, -14,  -8,
  968.  -14,  -8, -14, -25, -76,  -8, -14,  -8, -14,  -8,
  969.   -8,  -8,  -8, -40, 260, 256, -25, -63, 259, 263,
  970.  264, 260, -25, -63, -25, -63, -25, -63, -25, -63,
  971.  -25, -63, -25, -63, -40, -25, -49, -76, -40, -11,
  972.  -53, -76, -53, -53, -11, -16, -16, -16, -16, -23,
  973.  -14,  40, -63, -63, 261, -63, 261, 260, 261, -14,
  974.  -14, 261, -14, 261, 261, -66, 259, 263, 260, 256,
  975.  -67, -69, 259, -70, 260, -72, -74, 260, 259, 260,
  976.  260, 260, 259, -75, 259, -76, 260, -77, 260, 260,
  977.  259, 259, 259, 261, 260, -66, 260, -66, -66, 259,
  978.  -76, -78,  -9,  40, -79, 260, 256, 259,  -9, -13,
  979.  -79, 263, 260,  -9, -15,  91, -15, -13, 264, 264,
  980.   -9,  -9,  -9,  -9,  -9,  -9,  -9,  -9, -25, -25,
  981.  -25, -25, -25, -15, -25, -13, -15, -25, -13, -15,
  982.  -25, -13, -25, -15, -25, -13, -15, -25, -15, -25,
  983.  -15, -27, -76, -25, -15, -25, -15, -25, -25, -25,
  984.  -25, -40, -40, -65,  91, -40, -40, -27, -13, -64,
  985.  259, 263, 264, 260, -27, -13, -64, -27, -13, -64,
  986.  -27, -13, -64, -27, -13, -64, -25, -11, -11, -11,
  987.  -23, -23, -59, -80, -59, -59, -15, -63, -15, -15,
  988.  -15, 261, -68, 263, 256, -68, -71, -81, -66, -66,
  989.  -73, -82, 264, 259, -66, 259, 263, -73, 259, 259,
  990.  -71, -66, 259, 259, 259, 261, 259, 259, -71, -76,
  991.   40,  43,  40,  43,  45,  43,  45, 260, 259, 263,
  992.  260, 260, -64, -27, -13, -63, -27, -13, -63, -13,
  993.  259, -27, -63, -27, -13, -63, -27, -13, -63, -27,
  994.  -13, -63, -27, -13, -63, -27, -13, -63, -27, -13,
  995.  -27, -13, -27, -13, -27, -13, 259, 263, 260, -40,
  996.  -40, -40, -65, -40, -40, -40, -40, -40, -40, -40,
  997.  -40, -40, -40, -40, -40, -59, -64,  41, 263, -66,
  998.   58, 264, -76, 259,  41, -76, 260, -76, -79, -79,
  999.  -79, -79,  93,  93,  93, -64, -64, -64, -64, -64,
  1000.  -64, -64, -64,  93,  93,  93, 259,  41,  41,  40,
  1001.   40, -76, -76,  41,  41 };
  1002. short yydef[]={
  1003.  
  1004.    1,  -2,   4,   0,   0,   0,   0,   0,   7,   8,
  1005.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  1006.    0,   0,   0,   0,   0,   0,  26,   0,  28,   0,
  1007.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  1008.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  1009.    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  1010.    0,   0,   0,   0,   0,   0,   0,   0,   0, 241,
  1011.    0,   0,   0,   0,   0,   0,   0, 115,   0,   0,
  1012.  315, 317, 319,   0, 321,   0, 324, 325, 326, 413,
  1013.    0, 330,   0,   0,   0, 335,   0, 337,   0,   0,
  1014.    0, 342,   0,   0,   0,   0,   0,   0,   0,   0,
  1015.  352, 353,   0,   0,   0, 357, 358,   0,   0, 361,
  1016.  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
  1017.  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  1018.  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
  1019.  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
  1020.  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
  1021.  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
  1022.  200, 209, 210, 201, 202, 203, 204, 205, 206, 207,
  1023.  208, 211, 212, 213, 214, 215, 216, 217, 218, 219,
  1024.  220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
  1025.  230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  1026.  240, 242, 243, 244, 245, 246, 247, 248, 249, 250,
  1027.  251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
  1028.  261, 262, 263, 264, 265, 266, 267, 268, 269, 270,
  1029.  271, 272, 273, 274, 275, 276, 277, 278, 279, 280,
  1030.  281, 282, 283, 284, 285, 286, 287, 288, 289, 290,
  1031.  291, 292, 293, 294, 295, 296, 297, 298, 299, 300,
  1032.  301, 302, 303, 304, 305, 306, 307, 308, 309, 310,
  1033.  311, 312,   3,   2,   5,   6,   0, 380, 386,   0,
  1034.  392, 393,   0,   0, 132, 123, 132,   0,   0, 387,
  1035.  390, 391,   0,   0,   0,   0,   0, 385,   0,   0,
  1036.    0,   0, 388,  27,   0,   0,   0,   0,   0, 132,
  1037.    0, 132,   0, 132,   0,   0, 132,   0, 132,   0,
  1038.  132,   0, 132,   0, 381,   0, 132,   0, 132,   0,
  1039.    0,   0,   0,  65, 394, 395,   0,   0, 124, 125,
  1040.  126, 136,   0,   0,   0,   0,   0,   0,   0,   0,
  1041.    0,   0,   0,   0,  78,  79,   0,  -2,  81,   0,
  1042.   83, 384,  84,   0,   0,   0,   0,   0,   0,   0,
  1043.  132,   0, 103, 104, 108, 105, 109, 106, 107, 132,
  1044.  132, 113, 132, 114,   0, 314, 399, 400, 401, 402,
  1045.    0,   0, 320, 404,   0, 409, 328, 412, 329, 331,
  1046.    0,   0,   0, 409,   0,   0, 341, 404, 344,   0,
  1047.    0,   0,   0,   0, 350, 351, 354, 355, 356,   0,
  1048.    0, 404,   9,   0, 364, 366, 373, 379,  10,  11,
  1049.  374, 375, 376,  12,   0,   0,   0,  15,  16,  17,
  1050.   18,  19,  20,  21,  22,  23,  24,  25,  29,  30,
  1051.   31,  32,  33,   0,   0,  36,   0,   0,  39,   0,
  1052.    0,  41,   0,   0,   0,  46,   0,  47,   0,   0,
  1053.    0,  52, 382,   0,   0,   0,   0,   0,   0,   0,
  1054.    0,  66, 116, 127,   0,  67, 117,   0,   0,   0,
  1055.  128, 129, 130, 136,   0,   0,   0,   0,   0,   0,
  1056.    0,   0,   0,   0,   0,   0,  80,  82,  85,  86,
  1057.   87,   0,  89, 389,  90,  91,   0,   0, 110, 111,
  1058.  112, 313, 316, 397, 398, 318, 322, 403, 406, 323,
  1059.  327, 408, 411, 332, 333, 334, 336, 338, 339,   0,
  1060.  343, 345, 346, 347, 348, 349, 359,   0, 362,   0,
  1061.    0,   0,   0,   0,   0,   0,   0,  14,   0,   0,
  1062.    0,  13, 100,  34,  35,   0,  37,  38,   0,  40,
  1063.   42,  43,   0,  44,  45,   0,  48,  49,   0,  50,
  1064.   51,   0,  53,  55,   0,  54,  56,   0,  57,  58,
  1065.   59,  60,  61,  62,  63,  64,   0,   0,   0,  68,
  1066.   69, 118, 131,  70,  71, 119,  72,  73, 120,  74,
  1067.   75, 121,  76,  77, 122,  88,  96,  97, 396, 405,
  1068.    0, 410, 340, 360, 363,   0, 369,   0, 368, 370,
  1069.  377, 378, 133, 134, 135,  99,  94,  95,  98, 101,
  1070.  102,  92,  93, 137, 138, 139, 407, 365, 367,   0,
  1071.    0,   0,   0, 371, 372 };
  1072. #ifndef lint
  1073. static char yaccpar_sccsid[] = "@(#)yaccpar    4.1    (Berkeley)    2/11/83";
  1074. #endif
  1075.  
  1076. #
  1077. # define YYFLAG -1000
  1078. # define YYERROR goto yyerrlab
  1079. # define YYACCEPT return(0)
  1080. # define YYABORT return(1)
  1081.  
  1082. /*    parser for yacc output    */
  1083.  
  1084. #ifdef YYDEBUG
  1085. int yydebug = 0; /* 1 for debugging */
  1086. #endif
  1087. YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
  1088. int yychar = -1; /* current input token number */
  1089. int yynerrs = 0;  /* number of errors */
  1090. short yyerrflag = 0;  /* error recovery flag */
  1091.  
  1092. yyparse() {
  1093.  
  1094.     short yys[YYMAXDEPTH];
  1095.     short yyj, yym;
  1096.     register YYSTYPE *yypvt;
  1097.     register short yystate, *yyps, yyn;
  1098.     register YYSTYPE *yypv;
  1099.     register short *yyxi;
  1100.  
  1101.     yystate = 0;
  1102.     yychar = -1;
  1103.     yynerrs = 0;
  1104.     yyerrflag = 0;
  1105.     yyps= &yys[-1];
  1106.     yypv= &yyv[-1];
  1107.  
  1108.  yystack:    /* put a state and value onto the stack */
  1109.  
  1110. #ifdef YYDEBUG
  1111.     if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
  1112. #endif
  1113.         if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
  1114.         *yyps = yystate;
  1115.         ++yypv;
  1116.         *yypv = yyval;
  1117.  
  1118.  yynewstate:
  1119.  
  1120.     yyn = yypact[yystate];
  1121.  
  1122.     if( yyn<= YYFLAG ) goto yydefault; /* simple state */
  1123.  
  1124.     if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
  1125.     if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
  1126.  
  1127.     if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
  1128.         yychar = -1;
  1129.         yyval = yylval;
  1130.         yystate = yyn;
  1131.         if( yyerrflag > 0 ) --yyerrflag;
  1132.         goto yystack;
  1133.         }
  1134.  
  1135.  yydefault:
  1136.     /* default state action */
  1137.  
  1138.     if( (yyn=yydef[yystate]) == -2 ) {
  1139.         if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
  1140.         /* look through exception table */
  1141.  
  1142.         for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
  1143.  
  1144.         while( *(yyxi+=2) >= 0 ){
  1145.             if( *yyxi == yychar ) break;
  1146.             }
  1147.         if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
  1148.         }
  1149.  
  1150.     if( yyn == 0 ){ /* error */
  1151.         /* error ... attempt to resume parsing */
  1152.  
  1153.         switch( yyerrflag ){
  1154.  
  1155.         case 0:   /* brand new error */
  1156.  
  1157.             yyerror( "syntax error" );
  1158.         yyerrlab:
  1159.             ++yynerrs;
  1160.  
  1161.         case 1:
  1162.         case 2: /* incompletely recovered error ... try again */
  1163.  
  1164.             yyerrflag = 3;
  1165.  
  1166.             /* find a state where "error" is a legal shift action */
  1167.  
  1168.             while ( yyps >= yys ) {
  1169.                yyn = yypact[*yyps] + YYERRCODE;
  1170.                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
  1171.                   yystate = yyact[yyn];  /* simulate a shift of "error" */
  1172.                   goto yystack;
  1173.                   }
  1174.                yyn = yypact[*yyps];
  1175.  
  1176.                /* the current yyps has no shift onn "error", pop stack */
  1177.  
  1178. #ifdef YYDEBUG
  1179.                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
  1180. #endif
  1181.                --yyps;
  1182.                --yypv;
  1183.                }
  1184.  
  1185.             /* there is no state on the stack with an error shift ... abort */
  1186.  
  1187.     yyabort:
  1188.             return(1);
  1189.  
  1190.  
  1191.         case 3:  /* no shift yet; clobber input char */
  1192.  
  1193. #ifdef YYDEBUG
  1194.             if( yydebug ) printf( "error recovery discards char %d\n", yychar );
  1195. #endif
  1196.  
  1197.             if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
  1198.             yychar = -1;
  1199.             goto yynewstate;   /* try again in the same state */
  1200.  
  1201.             }
  1202.  
  1203.         }
  1204.  
  1205.     /* reduction by production yyn */
  1206.  
  1207. #ifdef YYDEBUG
  1208.         if( yydebug ) printf("reduce %d\n",yyn);
  1209. #endif
  1210.         yyps -= yyr2[yyn];
  1211.         yypvt = yypv;
  1212.         yypv -= yyr2[yyn];
  1213.         yyval = yypv[1];
  1214.         yym=yyn;
  1215.             /* consult goto table to find next state */
  1216.         yyn = yyr1[yyn];
  1217.         yyj = yypgo[yyn] + *yyps + 1;
  1218.         if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
  1219.         switch(yym){
  1220.             
  1221. case 1:
  1222. # line 371 "parser.y"
  1223. {scanner_start_line ();} break;
  1224. case 3:
  1225. # line 374 "parser.y"
  1226. {
  1227.                abstract_line_label = this_line_label =
  1228.                  record_label ((char *) yypvt[-1],
  1229.                        (text_dir ? current_text_pc ()
  1230.                         : current_data_pc ()));
  1231.              } break;
  1232. case 4:
  1233. # line 381 "parser.y"
  1234. {
  1235.           abstract_line_label = this_line_label = NULL;
  1236.         } break;
  1237. case 5:
  1238. # line 388 "parser.y"
  1239. {
  1240.           return (1);
  1241.         } break;
  1242. case 6:
  1243. # line 393 "parser.y"
  1244. {
  1245.           return (1);
  1246.         } break;
  1247. case 7:
  1248. # line 398 "parser.y"
  1249. {
  1250.           return (1);
  1251.         } break;
  1252. case 8:
  1253. # line 403 "parser.y"
  1254. {
  1255.           return (0);
  1256.         } break;
  1257. case 9:
  1258. # line 411 "parser.y"
  1259. {
  1260.           i_type_inst (yypvt[-2] == Y_LD_POP ? Y_LW_OP : yypvt[-2],
  1261.                    yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]), 
  1262.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1263.           if (yypvt[-2] == Y_LD_POP) {
  1264.             i_type_inst (Y_LW_OP, yypvt[-1] + 1, 
  1265.              addr_expr_reg((addr_expr *) yypvt[-0]),
  1266.              incr_expr_offset(addr_expr_imm((addr_expr *) yypvt[-0]), 4));
  1267.           }
  1268.           free ((void *) yypvt[-0]);
  1269.         } break;
  1270. case 10:
  1271. # line 424 "parser.y"
  1272. {
  1273.           i_type_inst (yypvt[-2], yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]), 
  1274.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1275.           free ((void *) yypvt[-0]);
  1276.         } break;
  1277. case 11:
  1278. # line 431 "parser.y"
  1279. {
  1280.           i_type_inst (yypvt[-2], yypvt[-1], 0, (imm_expr *) yypvt[-0]);
  1281.         } break;
  1282. case 12:
  1283. # line 437 "parser.y"
  1284. {
  1285.           if (addr_expr_reg ((addr_expr *) yypvt[-0]))
  1286.             i_type_inst (Y_ADDI_OP, yypvt[-1], 
  1287.                  addr_expr_reg((addr_expr *) yypvt[-0]),
  1288.                  addr_expr_imm ((addr_expr *) yypvt[-0]));
  1289.           else
  1290.             i_type_inst (Y_LUI_OP, yypvt[-1], 0, 
  1291.                  addr_expr_imm ((addr_expr *) yypvt[-0]));
  1292.           free ((void *) yypvt[-0]);
  1293.         } break;
  1294. case 13:
  1295. # line 450 "parser.y"
  1296. {
  1297.           i_type_inst (Y_ADDI_OP, A_DEST_RNUM, 0,
  1298.             addr_expr_imm(make_addr_expr(0, (char *) yypvt[-0], 0)));
  1299.           Store((char *)yypvt[-2], yypvt[-1]);
  1300.         } break;
  1301. case 14:
  1302. # line 458 "parser.y"
  1303. {
  1304.           i_type_inst (Y_ADDI_OP, A_DEST_RNUM, 0,
  1305.             addr_expr_imm(make_addr_expr(0, (char *) yypvt[-0], 0)));
  1306.           Store((char *)yypvt[-2], yypvt[-1]);
  1307.         } break;
  1308. case 15:
  1309. # line 466 "parser.y"
  1310. {
  1311.           i_type_inst (Y_ORI_OP, yypvt[-1], 0, (imm_expr *) yypvt[-0]);
  1312.         } break;
  1313. case 16:
  1314. # line 472 "parser.y"
  1315. {
  1316.           int *x = (int *) yypvt[-0];
  1317.  
  1318.           i_type_inst (Y_ORI_OP, 1, 0, const_imm_expr (*x));
  1319.           r_type_inst (Y_MTC1_OP, yypvt[-1], 0, 1);
  1320.           i_type_inst (Y_ORI_OP, 1, 0, const_imm_expr (*(x+1)));
  1321.           r_type_inst (Y_MTC1_OP, yypvt[-1] + 1, 0, 1);
  1322.         } break;
  1323. case 17:
  1324. # line 483 "parser.y"
  1325. {
  1326.           float x = * ((double *) yypvt[-0]);
  1327.           int *y = (int *) &x;
  1328.  
  1329.           i_type_inst (Y_ORI_OP, 1, 0, const_imm_expr (*y));
  1330.           r_type_inst (Y_MTC1_OP, yypvt[-1], 0, 1);
  1331.         } break;
  1332. case 18:
  1333. # line 493 "parser.y"
  1334. {
  1335. #ifdef BIGENDIAN
  1336.           i_type_inst (Y_LWL_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1337.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1338.           i_type_inst (Y_LWR_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1339.             incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 3));
  1340. #else
  1341.           i_type_inst (Y_LWL_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1342.                incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 3));
  1343.           i_type_inst (Y_LWR_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1344.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1345. #endif
  1346.           free ((void *) yypvt[-0]);
  1347.         } break;
  1348. case 19:
  1349. # line 510 "parser.y"
  1350. {
  1351. #ifdef BIGENDIAN
  1352.           i_type_inst ((yypvt[-2] == Y_ULH_POP ? Y_LB_OP : Y_LBU_OP),
  1353.                    yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1354.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1355.           i_type_inst (Y_LBU_OP, 1, addr_expr_reg ((addr_expr *) yypvt[-0]),
  1356.             incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 1));
  1357. #else
  1358.           i_type_inst ((yypvt[-2] == Y_ULH_POP ? Y_LB_OP : Y_LBU_OP),
  1359.                    yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1360.                incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 1));
  1361.           i_type_inst (Y_LBU_OP, 1, addr_expr_reg ((addr_expr *) yypvt[-0]),
  1362.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1363. #endif
  1364.           r_sh_type_inst (Y_SLL_OP, yypvt[-1], yypvt[-1], 8);
  1365.           r_type_inst (Y_OR_OP, yypvt[-1], yypvt[-1], 1);
  1366.           free ((void *) yypvt[-0]);
  1367.         } break;
  1368. case 20:
  1369. # line 531 "parser.y"
  1370. {
  1371.           i_type_inst (Y_LWC1_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1372.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1373.           if (yypvt[-2] == Y_L_D_POP) {
  1374.             i_type_inst (Y_LWC1_OP, yypvt[-1] + 1, 
  1375.               addr_expr_reg ((addr_expr *) yypvt[-0]),
  1376.               incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 4));
  1377.           }
  1378.           free ((void *) yypvt[-0]);
  1379.         } break;
  1380. case 21:
  1381. # line 544 "parser.y"
  1382. {
  1383.           i_type_inst (yypvt[-2] == Y_SD_POP ? Y_SW_OP : yypvt[-2],
  1384.                    yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]), 
  1385.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1386.           if (yypvt[-2] == Y_SD_POP) {
  1387.             i_type_inst (Y_SW_OP, yypvt[-1] + 1, 
  1388.               addr_expr_reg ((addr_expr *) yypvt[-0]),
  1389.               incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 4));
  1390.           }
  1391.           free ((void *) yypvt[-0]);
  1392.         } break;
  1393. case 22:
  1394. # line 558 "parser.y"
  1395. {
  1396.           i_type_inst (yypvt[-2], yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]), 
  1397.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1398.           free ((void *) yypvt[-0]);
  1399.         } break;
  1400. case 23:
  1401. # line 566 "parser.y"
  1402. {
  1403. #ifdef BIGENDIAN
  1404.           i_type_inst (Y_SWL_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1405.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1406.           i_type_inst (Y_SWR_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1407.                incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 3));
  1408. #else
  1409.           i_type_inst (Y_SWL_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1410.                incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 3));
  1411.           i_type_inst (Y_SWR_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1412.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1413. #endif
  1414.           free ((void *) yypvt[-0]);
  1415.         } break;
  1416. case 24:
  1417. # line 583 "parser.y"
  1418. {
  1419.           i_type_inst (Y_SB_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1420.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1421.           r_sh_type_inst (Y_SRL_OP, 1, yypvt[-1], 8);
  1422.           i_type_inst (Y_SB_OP, 1, addr_expr_reg ((addr_expr *) yypvt[-0]),
  1423.                incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 1));
  1424.           free ((void *) yypvt[-0]);
  1425.         } break;
  1426. case 25:
  1427. # line 594 "parser.y"
  1428. {
  1429.           i_type_inst (Y_SWC1_OP, yypvt[-1], addr_expr_reg ((addr_expr *) yypvt[-0]),
  1430.                    addr_expr_imm ((addr_expr *) yypvt[-0]));
  1431.           if (yypvt[-2] == Y_S_D_POP) {
  1432.             i_type_inst (Y_SWC1_OP, yypvt[-1] + 1, 
  1433.               addr_expr_reg ((addr_expr *) yypvt[-0]),
  1434.               incr_expr_offset (addr_expr_imm ((addr_expr *) yypvt[-0]), 4));
  1435.           }
  1436.           free ((void *) yypvt[-0]);
  1437.         } break;
  1438. case 26:
  1439. # line 607 "parser.y"
  1440. {
  1441.           r_type_inst (yypvt[-0], 0, 0, 0);
  1442.         } break;
  1443. case 27:
  1444. # line 613 "parser.y"
  1445. {
  1446.           if (yypvt[-0] == 1)
  1447.             yyerror ("Breakpoint 1 is reserved for debugger\n");
  1448.           r_type_inst (yypvt[-1], yypvt[-0], 0, 0);
  1449.         } break;
  1450. case 28:
  1451. # line 621 "parser.y"
  1452. {
  1453.           nop_inst ();
  1454.         } break;
  1455. case 29:
  1456. # line 627 "parser.y"
  1457. {
  1458.           if (yypvt[-1] != yypvt[-0])
  1459.             r_type_inst (Y_ADDU_OP, yypvt[-1], 0, yypvt[-0]);
  1460.  
  1461.           i_type_inst (Y_BGEZ_OP, 0, yypvt[-0], branch_offset (2));
  1462.           r_type_inst (Y_SUB_OP, yypvt[-1], 0, yypvt[-0]);
  1463.         } break;
  1464. case 30:
  1465. # line 637 "parser.y"
  1466. {
  1467.           r_type_inst (Y_SUB_OP, yypvt[-1], 0, yypvt[-0]);
  1468.         } break;
  1469. case 31:
  1470. # line 643 "parser.y"
  1471. {
  1472.           r_type_inst (Y_SUBU_OP, yypvt[-1], 0, yypvt[-0]);
  1473.         } break;
  1474. case 32:
  1475. # line 649 "parser.y"
  1476. {
  1477.           i_type_inst (Y_XORI_OP, yypvt[-1], yypvt[-0], const_imm_expr (1));
  1478.         } break;
  1479. case 33:
  1480. # line 655 "parser.y"
  1481. {
  1482.           r_type_inst (Y_ADDU_OP, yypvt[-1], 0, yypvt[-0]);
  1483.         } break;
  1484. case 34:
  1485. # line 661 "parser.y"
  1486. {
  1487.           r_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1488.         } break;
  1489. case 35:
  1490. # line 667 "parser.y"
  1491. {
  1492.           i_type_inst (op_to_imm_op (yypvt[-3]), yypvt[-2], yypvt[-1], (imm_expr *) yypvt[-0]);
  1493.         } break;
  1494. case 36:
  1495. # line 673 "parser.y"
  1496. {
  1497.           i_type_inst (op_to_imm_op (yypvt[-2]), yypvt[-1], yypvt[-1], (imm_expr *) yypvt[-0]);
  1498.         } break;
  1499. case 37:
  1500. # line 679 "parser.y"
  1501. {
  1502.           r_type_inst (yypvt[-3], yypvt[-2], yypvt[-0], yypvt[-1]);
  1503.         } break;
  1504. case 38:
  1505. # line 685 "parser.y"
  1506. {
  1507.           i_type_inst (op_to_imm_op (yypvt[-3]), yypvt[-2], yypvt[-0], (imm_expr *) yypvt[-1]);
  1508.         } break;
  1509. case 39:
  1510. # line 691 "parser.y"
  1511. {
  1512.           i_type_inst (op_to_imm_op (yypvt[-2]), yypvt[-1], yypvt[-0], (imm_expr *) yypvt[-1]);
  1513.         } break;
  1514. case 40:
  1515. # line 697 "parser.y"
  1516. {
  1517.           i_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], (imm_expr *) yypvt[-0]);
  1518.         } break;
  1519. case 41:
  1520. # line 703 "parser.y"
  1521. {
  1522.           i_type_inst (yypvt[-2], yypvt[-1], yypvt[-1], (imm_expr *) yypvt[-0]);
  1523.         } break;
  1524. case 42:
  1525. # line 709 "parser.y"
  1526. {
  1527.           r_sh_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1528.         } break;
  1529. case 43:
  1530. # line 715 "parser.y"
  1531. {
  1532.           r_type_inst (imm_op_to_op(yypvt[-3]), yypvt[-2], yypvt[-0], yypvt[-1]);
  1533.         } break;
  1534. case 44:
  1535. # line 721 "parser.y"
  1536. {
  1537.           r_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1538.         } break;
  1539. case 45:
  1540. # line 727 "parser.y"
  1541. {
  1542.           if (bare_machine)
  1543.             yyerror ("Immediate form not allowed in bare machine");
  1544.           else
  1545.             {
  1546.               if (!zero_imm ((imm_expr *) yypvt[-0]))
  1547.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1548.               r_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], 
  1549.                    (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1550.             }
  1551.         } break;
  1552. case 46:
  1553. # line 741 "parser.y"
  1554. {
  1555.           if (bare_machine)
  1556.             yyerror ("Immediate form not allowed in bare machine");
  1557.           else
  1558.             {
  1559.               if (!zero_imm ((imm_expr *) yypvt[-0]))
  1560.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1561.               r_type_inst (yypvt[-2], yypvt[-1], yypvt[-1], 
  1562.                    (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1563.             }
  1564.         } break;
  1565. case 47:
  1566. # line 755 "parser.y"
  1567. {
  1568.           /* The hardware divide operation (ignore 1st arg) */
  1569.           if (yypvt[-2] != Y_DIV_OP && yypvt[-2] != Y_DIVU_OP)
  1570.             yyerror ("Syntax error");
  1571.           r_type_inst (yypvt[-2], 0, yypvt[-1], yypvt[-0]);
  1572.         } break;
  1573. case 48:
  1574. # line 763 "parser.y"
  1575. {
  1576.           /* Pseudo divide operations */
  1577.           div_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0], 0);
  1578.         } break;
  1579. case 49:
  1580. # line 769 "parser.y"
  1581. {
  1582.           if (zero_imm ((imm_expr *) yypvt[-0]))
  1583.             yyerror ("Divide by zero");
  1584.           else
  1585.             {
  1586.               i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1587.               div_inst (yypvt[-3], yypvt[-2], yypvt[-1], 1, 1);
  1588.             }
  1589.         } break;
  1590. case 50:
  1591. # line 781 "parser.y"
  1592. {
  1593.           mult_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1594.         } break;
  1595. case 51:
  1596. # line 786 "parser.y"
  1597. {
  1598.           if (zero_imm ((imm_expr *) yypvt[-0]))
  1599.             r_type_inst (Y_ORI_OP, yypvt[-2], 0, 0);
  1600.           else
  1601.             {
  1602.               i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1603.               mult_inst (yypvt[-3], yypvt[-2], yypvt[-1], 1);
  1604.             }
  1605.         } break;
  1606. case 52:
  1607. # line 798 "parser.y"
  1608. {
  1609.           r_type_inst (yypvt[-2], 0, yypvt[-1], yypvt[-0]);
  1610.         } break;
  1611. case 53:
  1612. # line 804 "parser.y"
  1613. {
  1614.           r_type_inst (Y_SUBU_OP, 1, 0, yypvt[-0]);
  1615.           r_type_inst (Y_SLLV_OP, 1, 1, yypvt[-1]);
  1616.           r_type_inst (Y_SRLV_OP, yypvt[-2], yypvt[-0], yypvt[-1]);
  1617.           r_type_inst (Y_OR_OP, yypvt[-2], yypvt[-2], 1);
  1618.         } break;
  1619. case 54:
  1620. # line 813 "parser.y"
  1621. {
  1622.           r_type_inst (Y_SUBU_OP, 1, 0, yypvt[-0]);
  1623.           r_type_inst (Y_SRLV_OP, 1, 1, yypvt[-1]);
  1624.           r_type_inst (Y_SLLV_OP, yypvt[-2], yypvt[-0], yypvt[-1]);
  1625.           r_type_inst (Y_OR_OP, yypvt[-2], yypvt[-2], 1);
  1626.         } break;
  1627. case 55:
  1628. # line 822 "parser.y"
  1629. {
  1630.           long dist = eval_imm_expr ((imm_expr *) yypvt[-0]);
  1631.  
  1632.           r_sh_type_inst (Y_SLL_OP, 1, yypvt[-1], -dist);
  1633.           r_sh_type_inst (Y_SRL_OP, yypvt[-2], yypvt[-1], dist);
  1634.           r_type_inst (Y_OR_OP, yypvt[-2], yypvt[-2], 1);
  1635.         } break;
  1636. case 56:
  1637. # line 832 "parser.y"
  1638. {
  1639.           long dist = eval_imm_expr ((imm_expr *) yypvt[-0]);
  1640.  
  1641.           r_sh_type_inst (Y_SRL_OP, 1, yypvt[-1], -dist);
  1642.           r_sh_type_inst (Y_SLL_OP, yypvt[-2], yypvt[-1], dist);
  1643.           r_type_inst (Y_OR_OP, yypvt[-2], yypvt[-2], 1);
  1644.         } break;
  1645. case 57:
  1646. # line 843 "parser.y"
  1647. {
  1648.           set_le_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1649.         } break;
  1650. case 58:
  1651. # line 848 "parser.y"
  1652. {
  1653.           if (!zero_imm ((imm_expr *) yypvt[-0]))
  1654.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1655.           set_le_inst (yypvt[-3], yypvt[-2], yypvt[-1], (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1656.         } break;
  1657. case 59:
  1658. # line 856 "parser.y"
  1659. {
  1660.           set_gt_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1661.         } break;
  1662. case 60:
  1663. # line 861 "parser.y"
  1664. {
  1665.           if (!zero_imm ((imm_expr *) yypvt[-0]))
  1666.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1667.           set_gt_inst (yypvt[-3], yypvt[-2], yypvt[-1], (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1668.         } break;
  1669. case 61:
  1670. # line 870 "parser.y"
  1671. {
  1672.           set_ge_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1673.         } break;
  1674. case 62:
  1675. # line 875 "parser.y"
  1676. {
  1677.           if (!zero_imm ((imm_expr *) yypvt[-0]))
  1678.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1679.           set_ge_inst (yypvt[-3], yypvt[-2], yypvt[-1], (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1680.         } break;
  1681. case 63:
  1682. # line 883 "parser.y"
  1683. {
  1684.           set_eq_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1685.         } break;
  1686. case 64:
  1687. # line 888 "parser.y"
  1688. {
  1689.           if (!zero_imm ((imm_expr *) yypvt[-0]))
  1690.             i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-0]); /* Use $at */
  1691.           set_eq_inst (yypvt[-3], yypvt[-2], yypvt[-1], (zero_imm ((imm_expr *) yypvt[-0]) ? 0 : 1));
  1692.         } break;
  1693. case 65:
  1694. # line 896 "parser.y"
  1695. {
  1696.           i_type_inst (yypvt[-1], 0, 0, (imm_expr *) yypvt[-0]);
  1697.         } break;
  1698. case 66:
  1699. # line 902 "parser.y"
  1700. {
  1701.           i_type_inst (yypvt[-2], 0, yypvt[-1], (imm_expr *) yypvt[-0]);
  1702.         } break;
  1703. case 67:
  1704. # line 908 "parser.y"
  1705. {
  1706.           i_type_inst (yypvt[-2] == Y_BEQZ_POP ? Y_BEQ_OP : Y_BNE_OP,
  1707.                    0, yypvt[-1], (imm_expr *) yypvt[-0]);
  1708.         } break;
  1709. case 68:
  1710. # line 915 "parser.y"
  1711. {
  1712.           i_type_inst (yypvt[-3], yypvt[-1], yypvt[-2], (imm_expr *) yypvt[-0]);
  1713.         } break;
  1714. case 69:
  1715. # line 920 "parser.y"
  1716. {
  1717.           if (bare_machine)
  1718.             yyerror ("Immediate form not allowed on bare machine");
  1719.           else
  1720.             {
  1721.               if (zero_imm ((imm_expr *) yypvt[-1]))
  1722.             i_type_inst (yypvt[-3], yypvt[-2], (zero_imm ((imm_expr *) yypvt[-1]) ? 0 : 1), 
  1723.                      (imm_expr *) yypvt[-0]);
  1724.               else
  1725.             {
  1726.               i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-1]); /* Use $at */
  1727.               i_type_inst (yypvt[-3], yypvt[-2], (zero_imm ((imm_expr *) yypvt[-1]) ? 0 : 1), 
  1728.                        (imm_expr *) yypvt[-0]);
  1729.             }
  1730.             }
  1731.         } break;
  1732. case 70:
  1733. # line 939 "parser.y"
  1734. {
  1735.           r_type_inst (yypvt[-3] == Y_BGT_POP ? Y_SLT_OP : Y_SLTU_OP,
  1736.                    1, yypvt[-1], yypvt[-2]); /* Use $at */
  1737.           i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1738.         } break;
  1739. case 71:
  1740. # line 946 "parser.y"
  1741. {
  1742.           if (yypvt[-3] == Y_BGT_POP)
  1743.             {
  1744.               /* Use $at */
  1745.               i_type_inst (Y_SLTI_OP, 1, yypvt[-2], 
  1746.                    incr_expr_offset ((imm_expr *) yypvt[-1], 1));
  1747.               i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1748.             }
  1749.           else
  1750.             {
  1751.               /* Use $at */
  1752.               /* Can't add 1 to immediate since 0xffffffff+1 = 0 < 1 */
  1753.               i_type_inst (Y_ORI_OP, 1, 0,(imm_expr *) yypvt[-1]);
  1754.               i_type_inst (Y_BEQ_OP, yypvt[-2], 1, branch_offset (3));
  1755.               r_type_inst (Y_SLTU_OP, 1, yypvt[-2], 1);
  1756.               i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1757.             }
  1758.         } break;
  1759. case 72:
  1760. # line 967 "parser.y"
  1761. {
  1762.           r_type_inst (yypvt[-3] == Y_BGE_POP ? Y_SLT_OP : Y_SLTU_OP,
  1763.                    1, yypvt[-2], yypvt[-1]); /* Use $at */
  1764.           i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1765.         } break;
  1766. case 73:
  1767. # line 974 "parser.y"
  1768. {
  1769.           i_type_inst (yypvt[-3] == Y_BGE_POP ? Y_SLTI_OP : Y_SLTIU_OP,
  1770.                    1, yypvt[-2], (imm_expr *) yypvt[-1]); /* Use $at */
  1771.           i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1772.         } break;
  1773. case 74:
  1774. # line 982 "parser.y"
  1775. {
  1776.           r_type_inst (yypvt[-3] == Y_BLT_POP ? Y_SLT_OP : Y_SLTU_OP,
  1777.                    1, yypvt[-2], yypvt[-1]); /* Use $at */
  1778.           i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1779.         } break;
  1780. case 75:
  1781. # line 989 "parser.y"
  1782. {
  1783.           i_type_inst (yypvt[-3] == Y_BLT_POP ? Y_SLTI_OP : Y_SLTIU_OP,
  1784.                    1, yypvt[-2], (imm_expr *) yypvt[-1]); /* Use $at */
  1785.           i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1786.         } break;
  1787. case 76:
  1788. # line 997 "parser.y"
  1789. {
  1790.           r_type_inst (yypvt[-3] == Y_BLE_POP ? Y_SLT_OP : Y_SLTU_OP,
  1791.                    1, yypvt[-1], yypvt[-2]); /* Use $at */
  1792.           i_type_inst (Y_BEQ_OP, 0, 1,(imm_expr *) yypvt[-0]);
  1793.         } break;
  1794. case 77:
  1795. # line 1004 "parser.y"
  1796. {
  1797.           if (yypvt[-3] == Y_BLE_POP)
  1798.             {
  1799.               /* Use $at */
  1800.               i_type_inst (Y_SLTI_OP, 1, yypvt[-2], 
  1801.                    incr_expr_offset ((imm_expr *) yypvt[-1], 1));
  1802.               i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1803.             }
  1804.           else
  1805.             {
  1806.               /* Use $at */
  1807.               /* Can't add 1 to immediate since 0xffffffff+1 = 0 < 1 */
  1808.               i_type_inst (Y_ORI_OP, 1, 0, (imm_expr *) yypvt[-1]);
  1809.               i_type_inst (Y_BEQ_OP, yypvt[-2], 1, 
  1810.                    copy_imm_expr ((imm_expr *) yypvt[-0]));
  1811.               r_type_inst (Y_SLTU_OP, 1, yypvt[-2], 1);
  1812.               i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  1813.             }
  1814.         } break;
  1815. case 78:
  1816. # line 1026 "parser.y"
  1817. {
  1818.           if ((yypvt[-1] == Y_J_OP) || (yypvt[-1] == Y_JR_OP))
  1819.             j_type_inst (Y_J_OP, (imm_expr *) yypvt[-0]);
  1820.           else if ((yypvt[-1] == Y_JAL_OP) || (yypvt[-1] == Y_JALR_OP))
  1821.             j_type_inst (Y_JAL_OP, (imm_expr *) yypvt[-0]);
  1822.         } break;
  1823. case 79:
  1824. # line 1035 "parser.y"
  1825. {
  1826.           if ((yypvt[-1] == Y_J_OP) || (yypvt[-1] == Y_JR_OP))
  1827.             r_type_inst (Y_JR_OP, 0, yypvt[-0], 0);
  1828.           else if ((yypvt[-1] == Y_JAL_OP) || (yypvt[-1] == Y_JALR_OP))
  1829.             r_type_inst (Y_JALR_OP, 31, yypvt[-0], 0);
  1830.         } break;
  1831. case 80:
  1832. # line 1044 "parser.y"
  1833. {
  1834.           if ((yypvt[-2] == Y_J_OP) || (yypvt[-2] == Y_JR_OP))
  1835.             r_type_inst (Y_JR_OP, 0, yypvt[-0], 0);
  1836.           else if ((yypvt[-2] == Y_JAL_OP) || (yypvt[-2] == Y_JALR_OP))
  1837.             r_type_inst (Y_JALR_OP, yypvt[-1], yypvt[-0], 0);
  1838.         } break;
  1839. case 81:
  1840. # line 1052 "parser.y"
  1841. {
  1842.           i_type_inst ((yypvt[-1] == Y_BAL_POP ? Y_BGEZAL_OP : Y_BGEZ_OP),
  1843.                    0, 0, (imm_expr *) yypvt[-0]);
  1844.         } break;
  1845. case 82:
  1846. # line 1060 "parser.y"
  1847. {
  1848.           r_type_inst (yypvt[-2], yypvt[-1], yypvt[-0], 0);
  1849.         } break;
  1850. case 83:
  1851. # line 1066 "parser.y"
  1852. {
  1853.           r_type_inst (yypvt[-1], yypvt[-0], 0, 0);
  1854.         } break;
  1855. case 84:
  1856. # line 1072 "parser.y"
  1857. {
  1858.           r_type_inst (yypvt[-1], 0, yypvt[-0], 0);
  1859.         } break;
  1860. case 85:
  1861. # line 1078 "parser.y"
  1862. {
  1863.           if (yypvt[-2] == Y_MFC1_D_POP)
  1864.             {
  1865.               r_type_inst (Y_MFC1_OP, yypvt[-0], 0, yypvt[-1]);
  1866.               r_type_inst (Y_MFC1_OP, yypvt[-0] + 1, 0, yypvt[-1] + 1);
  1867.             }
  1868.           else if (yypvt[-2] == Y_MTC1_D_POP)
  1869.             {
  1870.               r_type_inst (Y_MTC1_OP, yypvt[-0], 0, yypvt[-1]);
  1871.               r_type_inst (Y_MTC1_OP, yypvt[-0] + 1, 0, yypvt[-1] + 1);
  1872.             }
  1873.           else
  1874.             r_type_inst (yypvt[-2], yypvt[-0], 0, yypvt[-1]);
  1875.         } break;
  1876. case 86:
  1877. # line 1095 "parser.y"
  1878. {
  1879.           r_type_inst (yypvt[-2], yypvt[-0], 0, yypvt[-1]);
  1880.         } break;
  1881. case 87:
  1882. # line 1101 "parser.y"
  1883. {
  1884.           r_type_inst (yypvt[-2], yypvt[-1], yypvt[-0], 0);
  1885.         } break;
  1886. case 88:
  1887. # line 1107 "parser.y"
  1888. {
  1889.           r_type_inst (yypvt[-3], yypvt[-2], yypvt[-1], yypvt[-0]);
  1890.         } break;
  1891. case 89:
  1892. # line 1113 "parser.y"
  1893. {
  1894.           r_type_inst (yypvt[-2], yypvt[-1], yypvt[-0], 0);
  1895.         } break;
  1896. case 90:
  1897. # line 1119 "parser.y"
  1898. {
  1899.           r_type_inst (yypvt[-2], yypvt[-1], yypvt[-0], 0);
  1900.         } break;
  1901. case 91:
  1902. # line 1125 "parser.y"
  1903. {
  1904.           r_cond_type_inst (yypvt[-2], yypvt[-1], yypvt[-0]);
  1905.         } break;
  1906. case 92:
  1907. # line 1130 "parser.y"
  1908. {
  1909.           if (((get_label_type((char *) yypvt[-3]) != WORD_A_TYPE) &&
  1910.                (get_label_type((char *) yypvt[-3]) != BYTE_A_TYPE)) ||
  1911.               ((yypvt[-1] != WORD_A_TYPE) && (yypvt[-1] != BYTE_A_TYPE)) ||
  1912.               ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE)))
  1913.             yyerror("ROR must use .byte or .word\n");
  1914.           r_type_inst (Y_SUBU_OP, 1, 0, A_SRC2_RNUM);
  1915.           r_type_inst (Y_SLLV_OP, 1, 1, A_SRC1_RNUM);
  1916.           r_type_inst (Y_SRLV_OP, A_DEST_RNUM, A_SRC2_RNUM,A_SRC1_RNUM);
  1917.           r_type_inst (Y_OR_OP, A_DEST_RNUM, A_DEST_RNUM, 1);
  1918.           Store((char *)yypvt[-3], yypvt[-2]);
  1919.         } break;
  1920. case 93:
  1921. # line 1144 "parser.y"
  1922. {
  1923.           if (((get_label_type((char *) yypvt[-3]) != WORD_A_TYPE) &&
  1924.                (get_label_type((char *) yypvt[-3]) != BYTE_A_TYPE)) ||
  1925.               ((yypvt[-1] != WORD_A_TYPE) && (yypvt[-1] != BYTE_A_TYPE)) ||
  1926.               ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE)))
  1927.             yyerror("ROR must use .byte or .word\n");
  1928.           r_type_inst (Y_SUBU_OP, 1, 0, A_SRC2_RNUM);
  1929.           r_type_inst (Y_SRLV_OP, 1, 1, A_SRC1_RNUM);
  1930.           r_type_inst (Y_SLLV_OP, A_DEST_RNUM, A_SRC2_RNUM,A_SRC1_RNUM);
  1931.           r_type_inst (Y_OR_OP, A_DEST_RNUM, A_DEST_RNUM, 1);
  1932.           Store((char *)yypvt[-3], yypvt[-2]);
  1933.         } break;
  1934. case 94:
  1935. # line 1158 "parser.y"
  1936. {
  1937.           if (((get_label_type((char *) yypvt[-3]) != WORD_A_TYPE) &&
  1938.                (get_label_type((char *) yypvt[-3]) != BYTE_A_TYPE)) ||
  1939.               ((yypvt[-1] != WORD_A_TYPE) && (yypvt[-1] != BYTE_A_TYPE)) ||
  1940.               ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE)))
  1941.             yyerror("Shift must use .byte or .word\n");
  1942.           r_type_inst (yypvt[-4], A_DEST_RNUM, A_SRC2_RNUM, A_SRC1_RNUM);
  1943.           Store((char *)yypvt[-3], yypvt[-2]);
  1944.         } break;
  1945. case 95:
  1946. # line 1169 "parser.y"
  1947. {
  1948.           if (((get_label_type((char *) yypvt[-3]) != WORD_A_TYPE) &&
  1949.                (get_label_type((char *) yypvt[-3]) != BYTE_A_TYPE)) ||
  1950.               ((yypvt[-1] != WORD_A_TYPE) && (yypvt[-1] != BYTE_A_TYPE)) ||
  1951.               ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE)))
  1952.             yyerror("Shift must use .byte or .word\n");
  1953.           r_type_inst (imm_op_to_op(yypvt[-4]),
  1954.                       A_DEST_RNUM, A_SRC2_RNUM, A_SRC1_RNUM);
  1955.           Store((char *)yypvt[-3], yypvt[-2]);
  1956.         } break;
  1957. case 96:
  1958. # line 1181 "parser.y"
  1959. {
  1960.           if (get_label_type((char *) yypvt[-2]) == FLOAT_A_TYPE) {
  1961.             if ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE))
  1962.               yyerror("Type mismatch");
  1963.             r_type_inst(Y_MTC1_OP, AF_DEST_RNUM, 0, A_SRC2_RNUM);
  1964.             r_type_inst(Y_CVT_S_W_OP, AF_SRC2_RNUM, AF_SRC2_RNUM, 0);
  1965.           }
  1966.           else if ((get_label_type((char *) yypvt[-2]) == WORD_A_TYPE) ||
  1967.                 (get_label_type((char *) yypvt[-2]) == BYTE_A_TYPE)) {
  1968.             if (yypvt[-0] != FLOAT_A_TYPE)
  1969.               yyerror("Type mismatch");
  1970.             r_type_inst(Y_CVT_W_S_OP, AF_SRC2_RNUM, AF_SRC2_RNUM, 0);
  1971.             r_type_inst(Y_MFC1_OP, AF_SRC2_RNUM, 0, A_DEST_RNUM);
  1972.           }
  1973.           else yyerror("Unknown type");
  1974.           Store((char *)yypvt[-2], yypvt[-1]);
  1975.         } break;
  1976. case 97:
  1977. # line 1200 "parser.y"
  1978. {
  1979.           if (yypvt[-1] != WORD_A_TYPE) {
  1980.               yyerror("Type mismatch.  In b (label), the label must be a .word\n");
  1981.           }
  1982.           r_type_inst(Y_JR_OP, 0, A_SRC1_RNUM, 0);
  1983.         } break;
  1984. case 98:
  1985. # line 1208 "parser.y"
  1986. {
  1987.           if (BadTypes(get_label_type((char *) yypvt[-3]), yypvt[-1], yypvt[-0]))
  1988.               yyerror("Type mismatch");
  1989.           switch (get_label_type((char *) yypvt[-3])) {
  1990.             case WORD_A_TYPE:
  1991.             case BYTE_A_TYPE:
  1992.               r_type_inst (yypvt[-4], A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM);
  1993.               break;
  1994.             case FLOAT_A_TYPE:
  1995.               r_type_inst (op_to_float_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  1996.               break;
  1997.             case DOUBLE_A_TYPE:
  1998.               r_type_inst (op_to_double_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  1999.               break;
  2000.             default:
  2001.               yyerror ("Unknown type");
  2002.           }
  2003.           Store((char *)yypvt[-3], yypvt[-2]);
  2004.         } break;
  2005. case 99:
  2006. # line 1229 "parser.y"
  2007. {
  2008.           if (BadTypes(get_label_type((char *) yypvt[-3]), yypvt[-1], yypvt[-0]))
  2009.               yyerror("Type mismatch");
  2010.           switch (get_label_type((char *) yypvt[-3])) {
  2011.             case WORD_A_TYPE:
  2012.             case BYTE_A_TYPE:
  2013.               r_type_inst (yypvt[-4], A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM);
  2014.               break;
  2015.             case FLOAT_A_TYPE:
  2016.               r_type_inst (op_to_float_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2017.               break;
  2018.             case DOUBLE_A_TYPE:
  2019.               r_type_inst (op_to_double_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2020.               break;
  2021.             default:
  2022.               yyerror ("Unknown type");
  2023.           }
  2024.           Store((char *)yypvt[-3], yypvt[-2]);
  2025.         } break;
  2026. case 100:
  2027. # line 1250 "parser.y"
  2028. {
  2029.           /* Source must be A_SRC2, because A_SRC2_RNUM = A_DEST_RNUM */
  2030.           switch (get_label_type((char *) yypvt[-2])) {
  2031.             case WORD_A_TYPE:
  2032.             case BYTE_A_TYPE:
  2033.               if (yypvt[-0] == FLOAT_A_TYPE)
  2034.                 r_type_inst(Y_MFC1_OP, AF_SRC2_RNUM, 0, A_DEST_RNUM);
  2035.               else if ((yypvt[-0] != WORD_A_TYPE) && (yypvt[-0] != BYTE_A_TYPE))
  2036.             yyerror("Type mismatch");
  2037.               break;
  2038.             case DOUBLE_A_TYPE:
  2039.               if (yypvt[-0] != DOUBLE_A_TYPE)
  2040.                 yyerror("Type mismatch");
  2041.               break;
  2042.             case FLOAT_A_TYPE:
  2043.               if ((yypvt[-0] == WORD_A_TYPE) || (yypvt[-0] == BYTE_A_TYPE))
  2044.             r_type_inst(Y_MTC1_OP, AF_DEST_RNUM, 0, A_SRC2_RNUM);
  2045.               else if (yypvt[-0] != FLOAT_A_TYPE)
  2046.             yyerror("Type mismatch");
  2047.               break;
  2048.             default:
  2049.               yyerror ("Unknown type");
  2050.           }
  2051.           Store((char *)yypvt[-2], yypvt[-1]);
  2052.         } break;
  2053. case 101:
  2054. # line 1277 "parser.y"
  2055. {
  2056.           if (BadTypes(get_label_type((char *) yypvt[-3]), yypvt[-1], yypvt[-0]))
  2057.               yyerror("Type mismatch");
  2058.           switch (get_label_type((char *) yypvt[-3])) {
  2059.             case WORD_A_TYPE:
  2060.               div_inst (yypvt[-4], A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM, 0);
  2061.               break;
  2062.             case BYTE_A_TYPE:
  2063.               div_inst (yypvt[-4], A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM, 0);
  2064.               break;
  2065.             case FLOAT_A_TYPE:
  2066.               r_type_inst (op_to_float_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2067.               break;
  2068.             case DOUBLE_A_TYPE:
  2069.               r_type_inst (op_to_double_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2070.               break;
  2071.             default:
  2072.               yyerror ("Unknown type");
  2073.           }
  2074.           Store((char *)yypvt[-3], yypvt[-2]);
  2075.         } break;
  2076. case 102:
  2077. # line 1300 "parser.y"
  2078. {
  2079.           if (BadTypes(get_label_type((char *) yypvt[-3]), yypvt[-1], yypvt[-0]))
  2080.               yyerror("Type mismatch");
  2081.           switch (get_label_type((char *) yypvt[-3])) {
  2082.             case WORD_A_TYPE:
  2083.               mult_inst (Y_MUL_POP, A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM);
  2084.               break;
  2085.             case BYTE_A_TYPE:
  2086.               mult_inst (Y_MUL_POP, A_DEST_RNUM, A_SRC1_RNUM, A_SRC2_RNUM);
  2087.               break;
  2088.             case FLOAT_A_TYPE:
  2089.               r_type_inst (op_to_float_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2090.               break;
  2091.             case DOUBLE_A_TYPE:
  2092.               r_type_inst (op_to_double_op(yypvt[-4]), AF_DEST_RNUM, AF_SRC1_RNUM, AF_SRC2_RNUM);
  2093.               break;
  2094.             default:
  2095.               yyerror ("Unknown type");
  2096.           }
  2097.           Store((char *)yypvt[-3], yypvt[-2]);
  2098.         } break;
  2099. case 103:
  2100. # line 1323 "parser.y"
  2101. {
  2102.           switch (yypvt[-0]) {
  2103.             case BYTE_A_TYPE:
  2104.               i_type_inst(Y_ORI_OP, 2, 0, make_imm_expr (11, NULL, 0));
  2105.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2106.               break;
  2107.             case WORD_A_TYPE:
  2108.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (1, NULL, 0));
  2109.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2110.               break;
  2111.             case FLOAT_A_TYPE:
  2112.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (2, NULL, 0));
  2113.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2114.               break;
  2115.             case DOUBLE_A_TYPE:
  2116.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (3, NULL, 0));
  2117.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2118.               break;
  2119.             default:
  2120.               yyerror ("Unknown type");
  2121.           }
  2122.         } break;
  2123. case 104:
  2124. # line 1347 "parser.y"
  2125. {
  2126.           switch (yypvt[-0]) {
  2127.             case BYTE_A_TYPE:
  2128.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (11, NULL, 0));
  2129.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2130.               break;
  2131.             case WORD_A_TYPE:
  2132.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (11, NULL, 0));
  2133.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2134.               break;
  2135.             case FLOAT_A_TYPE:
  2136.             case DOUBLE_A_TYPE:
  2137.             default:
  2138.               yyerror ("Bad type in putc, must be byte or word.");
  2139.           }
  2140.         } break;
  2141. case 105:
  2142. # line 1365 "parser.y"
  2143. {
  2144.           switch (yypvt[-0]) {
  2145.             case BYTE_A_TYPE:
  2146.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (1, NULL, 0));
  2147.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2148.               break;
  2149.             case WORD_A_TYPE:
  2150.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (1, NULL, 0));
  2151.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2152.               break;
  2153.             case FLOAT_A_TYPE:
  2154.             case DOUBLE_A_TYPE:
  2155.             default:
  2156.               yyerror ("Bad type in puti, must be byte or word.");
  2157.           }
  2158.         } break;
  2159. case 106:
  2160. # line 1383 "parser.y"
  2161. {
  2162.           i_type_inst (Y_ADDI_OP, A_SRC1_RNUM, 0, 
  2163.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-0], 0)));
  2164.           i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (4, NULL, 0));
  2165.           r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2166.         } break;
  2167. case 107:
  2168. # line 1391 "parser.y"
  2169. {
  2170.           i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (4, NULL, 0));
  2171.           r_type_inst (Y_ADD_OP, 4, yypvt[-0], 0);
  2172.           r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2173.         } break;
  2174. case 108:
  2175. # line 1398 "parser.y"
  2176. {
  2177.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (11, NULL, 0));
  2178.               r_type_inst (Y_ADD_OP, 4, yypvt[-0], 0);
  2179.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2180.         } break;
  2181. case 109:
  2182. # line 1405 "parser.y"
  2183. {
  2184.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (1, NULL, 0));
  2185.               r_type_inst (Y_ADD_OP, 4, yypvt[-0], 0);
  2186.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2187.         } break;
  2188. case 110:
  2189. # line 1412 "parser.y"
  2190. {
  2191.           switch (get_label_type((char *) yypvt[-1])) {
  2192.             case BYTE_A_TYPE:
  2193.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (12, NULL, 0));
  2194.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2195.               break;
  2196.             case WORD_A_TYPE:
  2197.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (5, NULL, 0));
  2198.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2199.               break;
  2200.             case FLOAT_A_TYPE:
  2201.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (6, NULL, 0));
  2202.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2203.               break;
  2204.             case DOUBLE_A_TYPE:
  2205.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (7, NULL, 0));
  2206.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2207.               break;
  2208.             default:
  2209.               yyerror ("Unknown type");
  2210.           }
  2211.           Store((char *)yypvt[-1], yypvt[-0]);
  2212.         } break;
  2213. case 111:
  2214. # line 1437 "parser.y"
  2215. {
  2216.           switch (get_label_type((char *) yypvt[-1])) {
  2217.             case BYTE_A_TYPE:
  2218.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (12, NULL, 0));
  2219.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2220.               break;
  2221.             case WORD_A_TYPE:
  2222.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (12, NULL, 0));
  2223.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2224.               break;
  2225.             case FLOAT_A_TYPE:
  2226.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (6, NULL, 0));
  2227.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2228.               break;
  2229.             case DOUBLE_A_TYPE:
  2230.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (7, NULL, 0));
  2231.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2232.               break;
  2233.             default:
  2234.               yyerror ("Unknown type");
  2235.           }
  2236.           Store((char *)yypvt[-1], yypvt[-0]);
  2237.         } break;
  2238. case 112:
  2239. # line 1462 "parser.y"
  2240. {
  2241.           switch (get_label_type((char *) yypvt[-1])) {
  2242.             case BYTE_A_TYPE:
  2243.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (5, NULL, 0));
  2244.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2245.               break;
  2246.             case WORD_A_TYPE:
  2247.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (5, NULL, 0));
  2248.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2249.               break;
  2250.             case FLOAT_A_TYPE:
  2251.             case DOUBLE_A_TYPE:
  2252.             default:
  2253.               yyerror ("Unknown type");
  2254.           }
  2255.           Store((char *)yypvt[-1], yypvt[-0]);
  2256.         } break;
  2257. case 113:
  2258. # line 1481 "parser.y"
  2259. {
  2260.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (12, NULL, 0));
  2261.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2262.               r_type_inst (Y_ADD_OP, yypvt[-0], 2, 0);
  2263.               break;
  2264.         } break;
  2265. case 114:
  2266. # line 1489 "parser.y"
  2267. {
  2268.               i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (5, NULL, 0));
  2269.               r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2270.               r_type_inst (Y_ADD_OP, yypvt[-0], 2, 0);
  2271.               break;
  2272.         } break;
  2273. case 115:
  2274. # line 1497 "parser.y"
  2275. {
  2276.           i_type_inst (Y_ORI_OP, 2, 0, make_imm_expr (10, NULL, 0));
  2277.           r_type_inst (Y_SYSCALL_OP, 0, 0, 0);
  2278.         } break;
  2279. case 116:
  2280. # line 1503 "parser.y"
  2281. {
  2282.           if ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE))
  2283.               yyerror("Type mismatch");
  2284.           i_type_inst (yypvt[-2], 0, A_SRC1_RNUM, (imm_expr *) yypvt[-0]);
  2285.         } break;
  2286. case 117:
  2287. # line 1511 "parser.y"
  2288. {
  2289.           if ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE))
  2290.               yyerror("Type mismatch");
  2291.           i_type_inst (yypvt[-2] == Y_BEQZ_POP ? Y_BEQ_OP : Y_BNE_OP,
  2292.                    0, A_SRC1_RNUM, (imm_expr *) yypvt[-0]);
  2293.         } break;
  2294. case 118:
  2295. # line 1520 "parser.y"
  2296. {
  2297.           if (((yypvt[-2] != BYTE_A_TYPE) && (yypvt[-2] != WORD_A_TYPE)) ||
  2298.               ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE)))
  2299.               yyerror("Type mismatch");
  2300.           i_type_inst (yypvt[-3], A_SRC1_RNUM, A_SRC2_RNUM, (imm_expr *) yypvt[-0]);
  2301.         } break;
  2302. case 119:
  2303. # line 1528 "parser.y"
  2304. {
  2305.           if (((yypvt[-2] != BYTE_A_TYPE) && (yypvt[-2] != WORD_A_TYPE)) ||
  2306.               ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE)))
  2307.               yyerror("Type mismatch");
  2308.           r_type_inst (yypvt[-3] == Y_BGT_POP ? Y_SLT_OP : Y_SLTU_OP,
  2309.                    1, A_SRC2_RNUM, A_SRC1_RNUM); /* Use $at */
  2310.           i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  2311.         } break;
  2312. case 120:
  2313. # line 1538 "parser.y"
  2314. {
  2315.           if (((yypvt[-2] != BYTE_A_TYPE) && (yypvt[-2] != WORD_A_TYPE)) ||
  2316.               ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE)))
  2317.               yyerror("Type mismatch");
  2318.           r_type_inst (yypvt[-3] == Y_BGE_POP ? Y_SLT_OP : Y_SLTU_OP,
  2319.                    1, A_SRC1_RNUM, A_SRC2_RNUM); /* Use $at */
  2320.           i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  2321.         } break;
  2322. case 121:
  2323. # line 1548 "parser.y"
  2324. {
  2325.           if (((yypvt[-2] != BYTE_A_TYPE) && (yypvt[-2] != WORD_A_TYPE)) ||
  2326.               ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE)))
  2327.               yyerror("Type mismatch");
  2328.           r_type_inst (yypvt[-3] == Y_BLT_POP ? Y_SLT_OP : Y_SLTU_OP,
  2329.                    1, A_SRC1_RNUM, A_SRC2_RNUM); /* Use $at */
  2330.           i_type_inst (Y_BNE_OP, 0, 1, (imm_expr *) yypvt[-0]);
  2331.         } break;
  2332. case 122:
  2333. # line 1558 "parser.y"
  2334. {
  2335.           if (((yypvt[-2] != BYTE_A_TYPE) && (yypvt[-2] != WORD_A_TYPE)) ||
  2336.               ((yypvt[-1] != BYTE_A_TYPE) && (yypvt[-1] != WORD_A_TYPE)))
  2337.               yyerror("Type mismatch");
  2338.           r_type_inst (yypvt[-3] == Y_BLE_POP ? Y_SLT_OP : Y_SLTU_OP,
  2339.                    1, A_SRC2_RNUM, A_SRC1_RNUM); /* Use $at */
  2340.           i_type_inst (Y_BEQ_OP, 0, 1, (imm_expr *) yypvt[-0]);
  2341.         } break;
  2342. case 124:
  2343. # line 1571 "parser.y"
  2344. {
  2345.           i_type_inst (Y_ORI_OP, A_SRC1_RNUM, 0, 
  2346.                    make_imm_expr (yypvt[-0], NULL, 0));
  2347.           yyval = WORD_A_TYPE;
  2348.         } break;
  2349. case 125:
  2350. # line 1578 "parser.y"
  2351. {
  2352.           char *c = (char *)yypvt[-0];
  2353.           if (strlen(c) > 1)
  2354.             yyerror("illegal character constant");
  2355.           i_type_inst (Y_ORI_OP, A_SRC1_RNUM, 0, make_imm_expr ((int)*c, NULL, 0));
  2356.           yyval = BYTE_A_TYPE;
  2357.         } break;
  2358. case 126:
  2359. # line 1587 "parser.y"
  2360. {
  2361.           /* This does not handle doubles! */
  2362.           float x = * ((double *) yypvt[-0]);
  2363.           int *y = (int *) &x;
  2364.  
  2365.           i_type_inst (Y_ORI_OP, 1, 0, const_imm_expr (*y));
  2366.           r_type_inst (Y_MTC1_OP, AF_SRC1_RNUM, 0, 1);
  2367.           yyval = FLOAT_A_TYPE;
  2368.         } break;
  2369. case 127:
  2370. # line 1598 "parser.y"
  2371. {
  2372.           if (yypvt[-0] == 0) {
  2373.               yyval = get_label_type((char *) yypvt[-1]);
  2374.           } else if (0 == strcmp((char *) yypvt[-1], "M")) {
  2375.               yyval = WORD_A_TYPE;
  2376.               yypvt[-1] = 0;
  2377.           } else if (0 == strcmp ((char *) yypvt[-1], "m")) {
  2378.               yyval = BYTE_A_TYPE;
  2379.               yypvt[-1] = 0;
  2380.           } else {
  2381.               yyval = BYTE_A_TYPE;
  2382.               yyerror("Bad array, use M or m.\n");
  2383.           }
  2384.           switch (yyval) {
  2385.             case WORD_A_TYPE:
  2386.               /*
  2387.               if ($2 != 0)
  2388.               r_sh_type_inst (Y_SLL_OP, $2, $2, 2);
  2389.               */
  2390.               i_type_inst (Y_LW_OP, A_SRC1_RNUM, yypvt[-0], 
  2391.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2392.               break;
  2393.             case BYTE_A_TYPE:
  2394.               i_type_inst (Y_LB_OP, A_SRC1_RNUM, yypvt[-0], 
  2395.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2396.               break;
  2397.             case FLOAT_A_TYPE:
  2398.               /*
  2399.               if ($2 != 0)
  2400.               r_sh_type_inst (Y_SLL_OP, $2, $2, 2);
  2401.               */
  2402.               i_type_inst (Y_LWC1_OP, AF_SRC1_RNUM, yypvt[-0], 
  2403.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2404.               break;
  2405.             case DOUBLE_A_TYPE:
  2406.               /*
  2407.               if ($2 != 0)
  2408.               r_sh_type_inst (Y_SLL_OP, $2, $2, 3);
  2409.               */
  2410.               i_type_inst (Y_LWC1_OP, AF_SRC1_RNUM, yypvt[-0], 
  2411.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2412.               i_type_inst (Y_LWC1_OP, AF_SRC1_RNUM + 1, yypvt[-0],
  2413.             incr_expr_offset(addr_expr_imm(
  2414.                 make_addr_expr(0, (char *) yypvt[-1], 0)), 4));
  2415.               break;
  2416.             default:
  2417.               yyerror ("Unknown type");
  2418.           }
  2419.         } break;
  2420. case 128:
  2421. # line 1650 "parser.y"
  2422. {
  2423.           i_type_inst (Y_ORI_OP, A_SRC2_RNUM, 0, 
  2424.                    make_imm_expr (yypvt[-0], NULL, 0));
  2425.           yyval = WORD_A_TYPE;
  2426.         } break;
  2427. case 129:
  2428. # line 1657 "parser.y"
  2429. {
  2430.           char *c = (char *)yypvt[-0];
  2431.           if (strlen(c) > 1)
  2432.             yyerror("illegal character constant");
  2433.           i_type_inst (Y_ORI_OP, A_SRC2_RNUM, 0, make_imm_expr ((int)*c, NULL, 0));
  2434.           yyval = BYTE_A_TYPE;
  2435.         } break;
  2436. case 130:
  2437. # line 1666 "parser.y"
  2438. {
  2439.           /* This does not handle doubles! */
  2440.           float x = * ((double *) yypvt[-0]);
  2441.           int *y = (int *) &x;
  2442.  
  2443.           i_type_inst (Y_ORI_OP, 1, 0, const_imm_expr (*y));
  2444.           r_type_inst (Y_MTC1_OP, AF_SRC2_RNUM, 0, 1);
  2445.           yyval = FLOAT_A_TYPE;
  2446.         } break;
  2447. case 131:
  2448. # line 1677 "parser.y"
  2449. {
  2450.           if (yypvt[-0] == 0) {
  2451.               yyval = get_label_type((char *) yypvt[-1]);
  2452.           } else if (0 == strcmp((char *) yypvt[-1], "M")) {
  2453.               yyval = WORD_A_TYPE;
  2454.               yypvt[-1] = 0;
  2455.           } else if (0 == strcmp ((char *) yypvt[-1], "m")) {
  2456.               yyval = BYTE_A_TYPE;
  2457.               yypvt[-1] = 0;
  2458.           } else {
  2459.               yyval = BYTE_A_TYPE;
  2460.               yyerror("Bad array, use M or m.\n");
  2461.           }
  2462.           switch (yyval) {
  2463.             case WORD_A_TYPE:
  2464.               /*
  2465.               if ($2 != 0)
  2466.               r_sh_type_inst (Y_SLL_OP, $2, $2, 2);
  2467.               */
  2468.               i_type_inst (Y_LW_OP, A_SRC2_RNUM, yypvt[-0], 
  2469.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2470.               break;
  2471.             case BYTE_A_TYPE:
  2472.               i_type_inst (Y_LB_OP, A_SRC2_RNUM, yypvt[-0], 
  2473.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2474.               break;
  2475.             case FLOAT_A_TYPE:
  2476.               /*
  2477.               if ($2 != 0)
  2478.               r_sh_type_inst (Y_SLL_OP, $2, $2, 2);
  2479.               */
  2480.               i_type_inst (Y_LWC1_OP, AF_SRC2_RNUM, yypvt[-0], 
  2481.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2482.               break;
  2483.             case DOUBLE_A_TYPE:
  2484.               /*
  2485.               if ($2 != 0)
  2486.               r_sh_type_inst (Y_SLL_OP, $2, $2, 3);
  2487.               */
  2488.               i_type_inst (Y_LWC1_OP, AF_SRC2_RNUM, yypvt[-0], 
  2489.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2490.               i_type_inst (Y_LWC1_OP, AF_SRC2_RNUM + 1, yypvt[-0],
  2491.             incr_expr_offset(addr_expr_imm(
  2492.                 make_addr_expr(0, (char *) yypvt[-1], 0)), 4));
  2493.               break;
  2494.             default:
  2495.               yyerror ("Unknown type");
  2496.           }
  2497.         } break;
  2498. case 132:
  2499. # line 1729 "parser.y"
  2500. { yyval = 0; } break;
  2501. case 133:
  2502. # line 1731 "parser.y"
  2503.           i_type_inst (Y_ORI_OP, A_DSUB_RNUM, 0, 
  2504.                    make_imm_expr (yypvt[-1], NULL, 0));
  2505.           yyval = A_DSUB_RNUM;
  2506.         } break;
  2507. case 134:
  2508. # line 1738 "parser.y"
  2509. {
  2510.           char *c = (char *)yypvt[-1];
  2511.           if (strlen(c) > 1)
  2512.             yyerror("illegal character constant");
  2513.           i_type_inst (Y_ORI_OP, A_DSUB_RNUM, 0, 
  2514.                    make_imm_expr ((int)*c, NULL, 0));
  2515.           yyval = A_DSUB_RNUM;
  2516.         } break;
  2517. case 135:
  2518. # line 1748 "parser.y"
  2519. {
  2520.           switch (get_label_type((char *) yypvt[-1])) {
  2521.             case WORD_A_TYPE:
  2522.               i_type_inst (Y_LW_OP, A_DSUB_RNUM, 0, 
  2523.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2524.               break;
  2525.             case BYTE_A_TYPE:
  2526.               i_type_inst (Y_LB_OP, A_DSUB_RNUM, 0, 
  2527.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2528.               break;
  2529.             case FLOAT_A_TYPE:
  2530.             case DOUBLE_A_TYPE:
  2531.             default:
  2532.               yyerror ("Bad array index.");
  2533.           }
  2534.           yyval = A_DSUB_RNUM;
  2535.         } break;
  2536. case 136:
  2537. # line 1767 "parser.y"
  2538. { yyval = 0; } break;
  2539. case 137:
  2540. # line 1769 "parser.y"
  2541.           i_type_inst (Y_ORI_OP, A_SUB_RNUM, 0, 
  2542.                    make_imm_expr (yypvt[-1], NULL, 0));
  2543.           yyval = A_SUB_RNUM;
  2544.         } break;
  2545. case 138:
  2546. # line 1776 "parser.y"
  2547. {
  2548.           char *c = (char *)yypvt[-1];
  2549.           if (strlen(c) > 1)
  2550.             yyerror("illegal character constant");
  2551.           i_type_inst (Y_ORI_OP, A_SUB_RNUM, 0, 
  2552.                    make_imm_expr ((int)*c, NULL, 0));
  2553.           yyval = A_SUB_RNUM;
  2554.         } break;
  2555. case 139:
  2556. # line 1786 "parser.y"
  2557. {
  2558.           switch (get_label_type((char *) yypvt[-1])) {
  2559.             case WORD_A_TYPE:
  2560.               i_type_inst (Y_LW_OP, A_SUB_RNUM, 0, 
  2561.               addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2562.               break;
  2563.             case BYTE_A_TYPE:
  2564.               i_type_inst (Y_LB_OP, A_SUB_RNUM, 0, 
  2565.                addr_expr_imm(make_addr_expr(0, (char *) yypvt[-1], 0)));
  2566.               break;
  2567.             case FLOAT_A_TYPE:
  2568.             case DOUBLE_A_TYPE:
  2569.             default:
  2570.               yyerror ("Bad array index.");
  2571.           }
  2572.           yyval = A_SUB_RNUM;
  2573.         } break;
  2574. case 314:
  2575. # line 2071 "parser.y"
  2576. {
  2577.           align_data (yypvt[-0]);
  2578.         } break;
  2579. case 315:
  2580. # line 2075 "parser.y"
  2581. {null_term = 0;} break;
  2582. case 316:
  2583. # line 2076 "parser.y"
  2584. {
  2585.           if (text_dir)
  2586.             yyerror ("Can't put data in text segment\n");
  2587.         } break;
  2588. case 317:
  2589. # line 2081 "parser.y"
  2590. {null_term = 1;} break;
  2591. case 318:
  2592. # line 2082 "parser.y"
  2593. {
  2594.           if (text_dir)
  2595.             yyerror ("Can't put data in text segment\n");
  2596.         } break;
  2597. case 321:
  2598. # line 2093 "parser.y"
  2599. {store_op = store_byte;} break;
  2600. case 322:
  2601. # line 2094 "parser.y"
  2602. {
  2603.           if (text_dir)
  2604.             yyerror ("Can't put data in text segment\n");
  2605.           if (abstract_line_label)
  2606.              set_label_type(abstract_line_label, BYTE_A_TYPE);
  2607.         } break;
  2608. case 323:
  2609. # line 2103 "parser.y"
  2610. {
  2611.           align_data (2);
  2612.           if (lookup_label ((char *) yypvt[-1])->addr == 0)
  2613.             record_label ((char *) yypvt[-1],current_data_pc ());
  2614.           increment_data_pc (yypvt[-0]);
  2615.         } break;
  2616. case 324:
  2617. # line 2112 "parser.y"
  2618. {
  2619.           user_kernel_data_segment (0);
  2620.           data_dir = 1; text_dir = 0;
  2621.           enable_data_alignment ();
  2622.         } break;
  2623. case 325:
  2624. # line 2119 "parser.y"
  2625. {
  2626.           user_kernel_data_segment (1);
  2627.           data_dir = 1; text_dir = 0;
  2628.           enable_data_alignment ();
  2629.         } break;
  2630. case 326:
  2631. # line 2125 "parser.y"
  2632. {store_op = store_double;} break;
  2633. case 327:
  2634. # line 2126 "parser.y"
  2635. {
  2636.           if (text_dir)
  2637.             yyerror ("Can't put data in text segment\n");
  2638.           if (abstract_line_label)
  2639.             set_label_type(abstract_line_label, DOUBLE_A_TYPE);
  2640.         } break;
  2641. case 333:
  2642. # line 2145 "parser.y"
  2643. {
  2644.           extern_directive ((char *) yypvt[-1], yypvt[-0]);
  2645.         } break;
  2646. case 334:
  2647. # line 2151 "parser.y"
  2648. {
  2649.              record_label ((char *) yypvt[-1], yypvt[-0]);
  2650.         } break;
  2651. case 335:
  2652. # line 2156 "parser.y"
  2653. {
  2654.           fatal_error ("File contains an .err directive\n");
  2655.         } break;
  2656. case 337:
  2657. # line 2164 "parser.y"
  2658. {store_op = store_float;} break;
  2659. case 338:
  2660. # line 2165 "parser.y"
  2661. {
  2662.           if (text_dir)
  2663.             yyerror ("Can't put data in text segment\n");
  2664.           if (abstract_line_label)
  2665.             set_label_type(abstract_line_label, FLOAT_A_TYPE);
  2666.         } break;
  2667. case 341:
  2668. # line 2179 "parser.y"
  2669. {
  2670.           make_label_global ((char *) yypvt[-0]);
  2671.         } break;
  2672. case 342:
  2673. # line 2184 "parser.y"
  2674. {store_op = (VoidProc) store_half;} break;
  2675. case 343:
  2676. # line 2185 "parser.y"
  2677. {
  2678.           if (text_dir)
  2679.             yyerror ("Can't put data in text segment\n");
  2680.         } break;
  2681. case 344:
  2682. # line 2192 "parser.y"
  2683. {
  2684.           record_label ((char *) yypvt[-1], (text_dir ? current_text_pc ()
  2685.                      : current_data_pc ()));
  2686.         } break;
  2687. case 345:
  2688. # line 2199 "parser.y"
  2689. {
  2690.           lcomm_directive ((char *) yypvt[-1], yypvt[-0]);
  2691.         } break;
  2692. case 351:
  2693. # line 2217 "parser.y"
  2694. {
  2695.           yyerror ("Warning: repeat directive ignored\n");
  2696.         } break;
  2697. case 352:
  2698. # line 2223 "parser.y"
  2699. {
  2700.           data_dir = 1; text_dir = 0;
  2701.           enable_data_alignment ();
  2702.         } break;
  2703. case 353:
  2704. # line 2230 "parser.y"
  2705. {
  2706.           data_dir = 1; text_dir = 0;
  2707.           enable_data_alignment ();
  2708.         } break;
  2709. case 354:
  2710. # line 2237 "parser.y"
  2711. {
  2712.           if (streq ((char *) yypvt[-0], "noat"))
  2713.             noat_flag = 1;
  2714.           else if (streq ((char *) yypvt[-0], "at"))
  2715.             noat_flag = 0;
  2716.         } break;
  2717. case 355:
  2718. # line 2246 "parser.y"
  2719. {
  2720.           if (data_dir)
  2721.             increment_data_pc (yypvt[-0]);
  2722.           else if (text_dir)
  2723.             increment_text_pc (yypvt[-0]);
  2724.         } break;
  2725. case 356:
  2726. # line 2255 "parser.y"
  2727. {
  2728.           yyerror ("Warning: struct directive ignored\n");
  2729.         } break;
  2730. case 357:
  2731. # line 2261 "parser.y"
  2732. {
  2733.           user_kernel_text_segment (0);
  2734.           data_dir = 0; text_dir = 1;
  2735.           enable_data_alignment ();
  2736.         } break;
  2737. case 358:
  2738. # line 2269 "parser.y"
  2739. {
  2740.           user_kernel_text_segment (1);
  2741.           data_dir = 0; text_dir = 1;
  2742.           enable_data_alignment ();
  2743.         } break;
  2744. case 361:
  2745. # line 2282 "parser.y"
  2746. {
  2747.           store_op = store_word_data;
  2748.           if (abstract_line_label)
  2749.             set_label_type(abstract_line_label, WORD_A_TYPE);
  2750.         } break;
  2751. case 363:
  2752. # line 2292 "parser.y"
  2753. {
  2754.           yyval = (int) make_addr_expr (0, NULL, yypvt[-1]);
  2755.         } break;
  2756. case 364:
  2757. # line 2297 "parser.y"
  2758. {
  2759.           yyval = (int) make_addr_expr (yypvt[-0], NULL, 0);
  2760.         } break;
  2761. case 365:
  2762. # line 2302 "parser.y"
  2763. {
  2764.           yyval = (int) make_addr_expr (yypvt[-3], NULL, yypvt[-1]);
  2765.         } break;
  2766. case 366:
  2767. # line 2307 "parser.y"
  2768. {
  2769.           yyval = (int) make_addr_expr (0, (char *) yypvt[-0], 0);
  2770.         } break;
  2771. case 367:
  2772. # line 2312 "parser.y"
  2773. {
  2774.           yyval = (int) make_addr_expr (0, (char *) yypvt[-3], yypvt[-1]);
  2775.         } break;
  2776. case 368:
  2777. # line 2317 "parser.y"
  2778. {
  2779.           yyval = (int) make_addr_expr (yypvt[-0], (char *) yypvt[-2], 0);
  2780.         } break;
  2781. case 369:
  2782. # line 2322 "parser.y"
  2783. {
  2784.           yyval = (int) make_addr_expr (yypvt[-2], (char *) yypvt[-0], 0);
  2785.         } break;
  2786. case 370:
  2787. # line 2327 "parser.y"
  2788. {
  2789.           yyval = (int) make_addr_expr (- yypvt[-0], (char *) yypvt[-2], 0);
  2790.         } break;
  2791. case 371:
  2792. # line 2332 "parser.y"
  2793. {
  2794.           yyval = (int) make_addr_expr (yypvt[-3], (char *) yypvt[-5], yypvt[-1]);
  2795.         } break;
  2796. case 372:
  2797. # line 2337 "parser.y"
  2798. {
  2799.           yyval = (int) make_addr_expr (- yypvt[-3], (char *) yypvt[-5], yypvt[-1]);
  2800.         } break;
  2801. case 373:
  2802. # line 2342 "parser.y"
  2803. {
  2804.           yyerror("Address expected\n\n");
  2805.           yyval = (int) make_addr_expr (0, "not defined!", 0);
  2806.         } break;
  2807. case 374:
  2808. # line 2350 "parser.y"
  2809. {
  2810.           yyval = (int) make_imm_expr (yypvt[-0], NULL, 0);
  2811.         } break;
  2812. case 375:
  2813. # line 2355 "parser.y"
  2814. {
  2815.           char *c = (char *)yypvt[-0];
  2816.           if (strlen(c) > 1)
  2817.             yyerror("illegal character constant");
  2818.           yyval = (int) make_imm_expr ((int)*c, NULL, 0);
  2819.         } break;
  2820. case 376:
  2821. # line 2363 "parser.y"
  2822. {
  2823.           yyval = (int) make_imm_expr (0, (char *) yypvt[-0], 0);
  2824.         } break;
  2825. case 377:
  2826. # line 2368 "parser.y"
  2827. {
  2828.           yyval = (int) make_imm_expr (yypvt[-0], (char *) yypvt[-2], 0);
  2829.         } break;
  2830. case 378:
  2831. # line 2373 "parser.y"
  2832. {
  2833.           yyval = (int) make_imm_expr (- yypvt[-0], (char *) yypvt[-2], 0);
  2834.         } break;
  2835. case 386:
  2836. # line 2394 "parser.y"
  2837. {
  2838.           if (yypvt[-0] < 0 || yypvt[-0] > 31)
  2839.             yyerror ("Register number out of range");
  2840.           if (yypvt[-0] == 1 && !bare_machine && !noat_flag)
  2841.             yyerror ("Register 1 is reserved for assembler");
  2842.           yyval = yypvt[-0];
  2843.         } break;
  2844. case 390:
  2845. # line 2410 "parser.y"
  2846. {
  2847.           if (yypvt[-0] < 0 || yypvt[-0] > 31)
  2848.             yyerror ("FP register number out of range");
  2849.           yyval = yypvt[-0];
  2850.         } break;
  2851. case 391:
  2852. # line 2417 "parser.y"
  2853. {
  2854.           yyerror("Floating point register required.\n\n");
  2855.           yyval = 0;
  2856.         } break;
  2857. case 394:
  2858. # line 2432 "parser.y"
  2859. {
  2860.           yyval = (int) make_imm_expr (- current_text_pc (), 
  2861.                         (char *) yypvt[-0], 1);
  2862.         } break;
  2863. case 395:
  2864. # line 2438 "parser.y"
  2865. {
  2866.           yyval = (int) make_imm_expr (0, "Not defined!", 0);
  2867.           yyerror("Label required.\n\n");
  2868.         } break;
  2869. case 396:
  2870. # line 2446 "parser.y"
  2871. {
  2872.           store_string ((char *) yypvt[-0], y_str_length, null_term);
  2873.         } break;
  2874. case 397:
  2875. # line 2450 "parser.y"
  2876. {
  2877.           store_string ((char *) yypvt[-0], y_str_length, null_term);
  2878.         } break;
  2879. case 398:
  2880. # line 2455 "parser.y"
  2881. {
  2882.           yyerror("String expected.\n\n");
  2883.         } break;
  2884. case 400:
  2885. # line 2464 "parser.y"
  2886. {
  2887.           char *c = (char *)yypvt[-0];
  2888.           if (strlen(c) > 1)
  2889.         yyerror("illegal character constant");
  2890.           yyval = (int)*c;
  2891.         } break;
  2892. case 401:
  2893. # line 2472 "parser.y"
  2894. {
  2895.           label *l = lookup_label ((char *) yypvt[-0]);
  2896.  
  2897.           if (l->addr == 0)
  2898.             {
  2899.               record_data_uses_symbol (current_data_pc (), l);
  2900.               yyval = 0;
  2901.             }
  2902.           else
  2903.             yyval = l->addr;
  2904.         } break;
  2905. case 402:
  2906. # line 2485 "parser.y"
  2907. {
  2908.           yyval = 0;
  2909.           yyerror("Expression expected.\n\n");
  2910.         } break;
  2911. case 404:
  2912. # line 2494 "parser.y"
  2913. {
  2914.           store_op(0);
  2915.         } break;
  2916. case 405:
  2917. # line 2500 "parser.y"
  2918. {
  2919.           store_op (yypvt[-0]);
  2920.         } break;
  2921. case 406:
  2922. # line 2504 "parser.y"
  2923. {
  2924.           store_op (yypvt[-0]);
  2925.         } break;
  2926. case 407:
  2927. # line 2508 "parser.y"
  2928. {
  2929.           int i;
  2930.  
  2931.           for (i = 0; i < yypvt[-0]; i ++)
  2932.             store_op (yypvt[-2]);
  2933.         } break;
  2934. case 409:
  2935. # line 2519 "parser.y"
  2936. {
  2937.           double z = 0;
  2938.           store_op(&z);
  2939.         } break;
  2940. case 410:
  2941. # line 2526 "parser.y"
  2942. {
  2943.           store_op (yypvt[-0]);
  2944.         } break;
  2945. case 411:
  2946. # line 2530 "parser.y"
  2947. {
  2948.           store_op (yypvt[-0]);
  2949.         } break;
  2950. case 413:
  2951. # line 2537 "parser.y"
  2952. {yyval = 0;} break; 
  2953.         }
  2954.         goto yystack;  /* stack new state and value */
  2955.  
  2956.     }
  2957.